Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2015, 05:22   #1
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию EAccessViolation при завершении приложения

Добра всем!
Столкнулся с такой проблемой, не могу решить:
При завершении приложения вылетает ошибка "Exception EAccessViolation in module..."
yy.jpg
Вроде бы никаких ресурсов не трогаю, перепробовал отключать очистки переменных, но увы: ошибка сто процентов всегда появляется, при чем в IDE её не отследить.

вот код приема файла (в принципе работает иногда зависает):
оригинальный код тут (работает лишь с текстовыми файлами)
Код:
...    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); 
  private
    Name: string; // Имя файла
    Size: integer; // Размер файла
    Receive: boolean; // Режим клиента
    MS: TMemoryStream; // Буфер для файла
    P: ^Byte;
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  Rtext: string; // Принятый текст
  L:integer;
begin
  if Receive then // Если клиент в режиме приёма файла, то...
    // Записываем данные в буфер
    begin
      if MS.Size < Size then // Если принято байт меньше размера файла, то...
      L:=Socket.ReceiveLength;
      Socket.ReceiveBuf(P,L);     
      MS.WriteBuffer(P,L);
      ProgressBar1.Position := MS.Size*100 div Size;
      Label1.Caption:='Принято '+IntToStr(MS.Size)+' из '+IntTostr(Size);
      if MS.Size = Size then // Если файл принят, то...
       begin
        Receive := false;
        MS.Position := 0;
        MS.SaveToFile(extractfilepath(paramstr(0))+Name);
        ClientSocket1.Socket.SendText('#end#');
        MS.Free;
        memo1.Lines.Add('Файл принят');
       end;
    end
  else// Если клиент не в режиме приёма файла, то...
 begin
    Rtext:=Socket.ReceiveText;
   if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
    begin
      MS := TMemoryStream.Create; // Создаём буфер для файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
      Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
      Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
      memo1.Lines.Add('Размер файла: '+IntToStr(Size)+' байт');
      memo1.Lines.Add('Имя файла: '+Name);
      Receive := true; // Переводим сервер в режим приёма файла
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientSocket1.Open; 
  Receive := false; // Режим клиента - приём команд
end;
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось Stilet; 10.09.2015 в 09:04.
100GRamm вне форума Ответить с цитированием
Старый 10.09.2015, 09:06   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Напиши:
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  Rtext: string; // Принятый текст
  L:integer;
begin
 exit;
Будет ошибка?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2015, 09:57   #3
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Напиши:
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  Rtext: string; // Принятый текст
  L:integer;
begin
 exit;
Будет ошибка?
Нет, ошибки нет. Ошибка возникает только если проходила пересылка .

Есть подозрение , но точно не знаю: я ж использую P: ^byte, надо ли как то определять размер выделяемой памяти? а может быть как -то явно стоит ее освобождать?

Сделал так, но результат тот же
Цитата:
private
Name: string; // Имя файла
Size: integer; // Размер файла
Receive: boolean; // Режим клиента
MS: TMemoryStream; // Буфер для файла
P: array of Byte;
и так тоже
Цитата:
P: array [0..1024] of Byte;
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось 100GRamm; 10.09.2015 в 10:16.
100GRamm вне форума Ответить с цитированием
Старый 10.09.2015, 10:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты память не выделяешь? Если нет, то конечно нужно выделять и освобождать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2015, 10:26   #5
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты память не выделяешь? Если нет, то конечно нужно выделять и освобождать.
это как? если не секрет?

если так: MS.Free;
а массив явно определен : P: array [0..1024] of Byte;
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось 100GRamm; 10.09.2015 в 10:28.
100GRamm вне форума Ответить с цитированием
Старый 10.09.2015, 10:28   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
      L:=Socket.ReceiveLength;
p:=GetMem(l);
      Socket.ReceiveBuf(P,L);     
      MS.WriteBuffer(P,L);
FreeMem(p,l);
Только не понимаю, как ты не зная таких основ смог написать такой код?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2015, 10:53   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Только не понимаю, как ты не зная таких основ смог написать такой код?
Копи-паст и гугл помогли...
p51x вне форума Ответить с цитированием
Старый 10.09.2015, 10:58   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Копи-паст и гугл помогли.
Ну да. Похоже на то.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2015, 12:27   #9
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну да. Похоже на то.
не похоже, а так и сделал, и ссылку оставил.
Зачем рисовать велосипед, если он уже есть?
Немного адаптировал код под передачу бинарных данных (см.ссылку)
qq.jpg
yy221.jpg
yy22.jpg
..никогда не думал что этой функцией можно выделять для Byte память... в итоге так сделал : GetMem(P,L);

..все равно ошибка при закрытии тоже
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось 100GRamm; 10.09.2015 в 13:37.
100GRamm вне форума Ответить с цитированием
Старый 10.09.2015, 12:45   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Зачем рисовать велосипед, если он уже есть?
Да, но если он с квадратными колесами и плохо закрепленным рулем (а твой код кстати нестабилен, если ты используешь раритетные компоненты), может и стоит изобрести новый велосипед посовременней.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
runtime error 216 at 5b261531 в dll при завершении приложения Volkogriz Общие вопросы Delphi 7 12.02.2013 18:26
выполнение js кода при завершении программы на delphi xamel87 Общие вопросы Delphi 1 08.05.2011 18:45
Ошибка при завершении программы _-Re@l-_ Общие вопросы Delphi 2 01.09.2010 21:32
создание dll при старте приложения и удаление при завершении TyoshA Общие вопросы Delphi 7 13.07.2009 13:56
приложение без формы, событие при завершении ERASERROR Общие вопросы Delphi 10 22.02.2008 14:10