"External exception" при закрытии TRegIniFile

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
artem78
новенький
Сообщения: 50
Зарегистрирован: 09.08.2015 17:52:24

"External exception" при закрытии TRegIniFile

Сообщение artem78 »

Возьмём для примера следующий код для чтения значения параметра в реестре через TRegIniFile:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  regini: TRegIniFile;
begin
  RegIni := TRegIniFile.Create('');
  try
    RegIni.RootKey := HKEY_CURRENT_USER;
    res.Text:= RegIni.ReadString(Path.Text, key.Text, '');
  finally
    RegIni.Free;
  end;
end; 


Если запускать в отладчике IDE, то на строке RegIni.Free возникает данная ошибка:

20211002_184013.png


Если запустить исполняемый файл напрямую, ошибки не будет. Кстати, в Delphi 7 этот же код также выполняется без ошибок.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

artem78 писал(а):RegIni := TRegIniFile.Create('');

1. А если из скобок убрать пустую строку?
2. А если предположить, что у Вас в "Path.Text" или в "key.Text" чёрте что и в попе бантик?
Как видите, возможностей совершить ошибку в Вашем коде хоть пруд пруди, что и происходит. Ищите...

artem78 писал(а):Если запустить исполняемый файл напрямую, ошибки не будет.

Потому что в исполняемом файле "напрямую" у Вас есть подушка безопасности - try ... finally, в IDE она игнорируется.
Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

На КиберФоруме пишут что так работает ... ( Прикол именно в KEY_READ )

Код: Выделить всё

function FromReg2(Path: string): String;
var
  reg:TRegistry;
begin
 
  Reg:= TRegistry.Create(KEY_READ);
  with reg do
  try
   rootKey := HKEY_LOCAL_MACHINE;
    openKey(Path,false);
    result:=readstring('');
    closeKey;
  finally
    free;
  end;
 
end;
artem78
новенький
Сообщения: 50
Зарегистрирован: 09.08.2015 17:52:24

Сообщение artem78 »

Vadim писал(а):1. А если из скобок убрать пустую строку?

Без изменений.

Vadim писал(а):2. А если предположить, что у Вас в "Path.Text" или в "key.Text" чёрте что и в попе бантик?

Vadim писал(а):Как видите, возможностей совершить ошибку в Вашем коде хоть пруд пруди

Думаю, Вы сами прекрасно понимаете, что данный код написан в качестве примера. В рабочем проекте я хочу проверить наличие своей программы в автозапуске (ветка HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run).

Alex2013
А в чём собственно говоря разница между TRegIniFile и TRegistry?
Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

artem78 писал(а):А в чём собственно говоря разница между TRegIniFile и TRegistry?


Пишут что TRegIniFile нужен для совместимости с Windows 3 и для переноса ini файлов в реестр. :idea:
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Возьмём для примера следующий код для чтения значения параметра в реестре через TRegIniFile:
Будте любезны дать минимальный пример с воспроизводимой ошибкой, а не копипасту откуда непойми.

>>Если запустить исполняемый файл напрямую, ошибки не будет
Запуск под иде и вживую - разные вещи, например переменные окружения отличатся могут, текущая папка, и т.п.
Кроме того без отладчика некоторые вылеты можно не увидеть, пример - при закрытии программа молча свалилась и если лога нет - вот и пойми штатно она закрылась или нет. точно не валится?

Добавлено спустя 4 минуты 21 секунду:
>>На КиберФоруме пишут что так работает ... ( Прикол именно в KEY_READ )
Это как на заборе. хорошо что не то что я сначала подумал, а KEY_READ.
Ты бы ссылки хоть чтоли давал откуда куда тащишь. С ошибками надо разбираться и понимать причину, а не чтото гдето ктото комуто пишут.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

artem78 писал(а):Думаю, Вы сами прекрасно понимаете, что данный код написан в качестве примера.

Я то как раз думаю, что Вы дали пример, в котором ошибка никак не воспроизводится, поэтому что у Вас там на самом деле - совершенно непонятно, поэтому и помочь Вам никакой возможности нет. ;-)
Постарайтесь это понять.
Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

zub писал(а):Ты бы ссылки хоть чтоли давал откуда куда тащишь. С ошибками надо разбираться и понимать причину, а не чтото гдето ктото комуто пишут.

Разумеется, главный перфекционист этого фрума плохого не посоветует. Постараюсь учесть ! :idea:
(Просто я вообще встрял туда где обычно говорят "гугл в помощь"( просто самому немного интересно стало разобраться в чем дело ), а уж отменить и найти источник кода через контекстное меню браузема , это вообще как-бы все равно что ссылка... но если вдруг кому-то лень два клика сделать то вот https://www.cyberforum.ru/delphi-beginn ... 88812.html )
По TRegIniFile...
http://delphimaster.net/view/4-43213
Последний раз редактировалось Alex2013 07.10.2021 08:58:38, всего редактировалось 1 раз.
artem78
новенький
Сообщения: 50
Зарегистрирован: 09.08.2015 17:52:24

Сообщение artem78 »

zub писал(а):Будте любезны дать минимальный пример с воспроизводимой ошибкой, а не копипасту откуда непойми.


Да пожалуйста -
RegTest.zip
. Запускаю в Lazarus 2.0.13 32bit на Windows 7 64bit в режиме Default.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Вылета нет. транк fpc\lazarus
artem78
новенький
Сообщения: 50
Зарегистрирован: 09.08.2015 17:52:24

Сообщение artem78 »

В итоге заменил TRegIniFile на TRegistry. С ним работает нормально. Всем спасибо.
Ответить