Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно открыть чужой файл на другом ПK, И немешать другому процессу (TString) 
:(
    Опции темы
GRU
Дата 1.7.2015, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 20.7.2004

Репутация: 1
Всего: 1



Добрый день,

Есть два ПК и win2000, на одном программа записывает текстовый файл, на другом поставил софт для мониторинга этого файла и хочу отследить последнию строку после изменения. Когда запустил программу, на первом ПК иногда стало выскакивать ошибка Access violation at address 00000000. Read of address 00000000. Пока висит это ошибка то в этот файл незаписывается новые данные. Это совпадение или я неправильно открываю файл для считывания данниx.

ПК1. Этот код изменить немогу, скомпилированный
Код

procedure SaveToTxt(AText :Widestring);
var 
  FList : TStrings;
begin
   try
      FList := TStringList.create;
      FList.LoadfromFile('D:\DATA\DB\MyText.txt');
      FList.add(AText);
      FList.SaveToFile('D:\DATA\DB\MyText.txt');
   except
      FList.free;
   end;
   FList.free;
end;


ПК2 с моим кодом:
Код

function TForm1.FindLastRow(AFileName: TFileName): string;  // \\PC\D!\DATA\DB\MyText.txt 
var
  Row: string;
  RowEnd: boolean;
  Buf: array[1..1] of Char;
  k: longword;
  i: integer;
  FFile: TFileStream;
begin
  try
   Row := '';
    if (not FileExists(AFileName)) then Exit;

    FFile := TFileStream.Create(AFileName,{fmOpenReadWrite or }fmShareDenyNone);
    k := FFile.Size - 1;
    FFile.Seek(k, soFromBeginning);
    repeat
      RowEnd := false;
      while (not RowEnd) do begin
        FFile.Read(Buf, SizeOf(Buf));
        if (ord(buf[1]) <> 13)
        then begin
          if (ord(buf[1]) <> 10)
          then Row := buf[1] + Row;
        end
        else begin
          RowEnd := true;
        end;
        k := k - 1;
        FFile.Seek(k, soFromBeginning);
      end;
    until (Row <> '') or (k = 0);
    Result := Row;
  finally
    FreeAndNil(FFile);
  end;
end;


Спасибо за помощь.

Это сообщение отредактировал(а) GRU - 3.7.2015, 11:11
PM MAIL   Вверх
Poseidon
Дата 2.7.2015, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Наврятли AV выскочит в первом коде при чтении файла вторым кодом. Где-то в другом месте возникает исключение.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
northener
Дата 2.7.2015, 15:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



При возникновении исключения FList.free; вызовется два раза подряд. Вот одно место для AV. Если вся та программа так написана, то таких мест может быть много.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 3.7.2015, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(northener @  2.7.2015,  15:05 Найти цитируемый пост)
При возникновении исключения FList.free; вызовется два раза подряд
а при исключении в конструкторе - три раза, последние два из них с рандомным адресом объекта



--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 3.7.2015, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(bems @  3.7.2015,  01:16 Найти цитируемый пост)
а при исключении в конструкторе - три раза, последние два из них с рандомным адресом объекта

Точно.
Но если ТС не врет, то AV с "Read of address 00000000" возникает не в этом коде.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
GRU
Дата 3.7.2015, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 20.7.2004

Репутация: 1
Всего: 1



Спасибо ещё раз. Буду искать дальше или глубже smile Eсли найду ошибку обезательно напишу. 

Только хотел спросить что токое "ТС".
PM MAIL   Вверх
northener
Дата 3.7.2015, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(GRU @  3.7.2015,  11:07 Найти цитируемый пост)
Только хотел спросить что токое "ТС". 

Топик Стартер. Т.е. автор темы.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Poseidon
Дата 6.7.2015, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(northener @  2.7.2015,  15:05 Найти цитируемый пост)
При возникновении исключения FList.free; вызовется два раза подряд. Вот одно место для AV. 
Повторный вызов Free сгенерирует "Invalid pointer operation", но никак не AV.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
bems
Дата 6.7.2015, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Poseidon @  6.7.2015,  14:25 Найти цитируемый пост)
Повторный вызов Free сгенерирует "Invalid pointer operation", но никак не AV. 
может и АV, в зависимости от того что произошло с этим адресом после освобождения

Цитата(northener @  3.7.2015,  02:53 Найти цитируемый пост)
AV с "Read of address 00000000" возникает не в этом коде
да, там и сам адрес исключения 0, так что тут вызов процедурной переменной равной nil



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1235 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.