Перестал работать ранее рабочий код

LiYing
Дата: 20.12.2019 10:01:14
Delphi XE, win 7x64. Прекрасно работающий несколько лет назад код, вдруг стал выдавать AV
Project xxx.exe raised exception class EAccessViolation with message 'Access violation at address 00409230 in module 'xxx.exe'. Read of address CC8B1287'.

Сокращенный до воспроизводимого минимума код:
function GetNumForNextInstance: string;
var
  il: TList<Integer>;

  function EnumProc(h: HWND; Param: LongInt): Boolean; stdcall;
  begin
    il.Add(1); // AV here!
  end;

begin
  il := TList<Integer>.Create;
  try
    il.Add(0); // OK
    EnumWindows(@EnumProc, 0);
  finally
    il.Free;
  end;
end;

Что не так?
Скрин с callstack:
alekcvp
Дата: 20.12.2019 10:16:56
LiYing,

А так?
function EnumProc(h: HWND; Param: LPARAM): Boolean; stdcall;
var
  il: TList<Integer> absolute Param;
begin
  il.Add(1); 
end;

function GetNumForNextInstance: string;
var
  il: TList<Integer>;
begin
  il := TList<Integer>.Create;
  try
    il.Add(0); // OK
    EnumWindows(@EnumProc, LPARAM(il));
  finally
    il.Free;
  end;
end;

Завязывайте уже с локальными коллбэками, да ещё и с обращением к внешним переменным.
LiYing
Дата: 20.12.2019 10:34:50
alekcvp
А так?

Так работает, спасибо!
Завязываю... :)
Василий 2
Дата: 20.12.2019 10:37:21
Странно, что вообще давал такое провернуть.
LiYing
Дата: 20.12.2019 10:43:19
Василий 2
Странно, что вообще давал такое провернуть.

Чесслово, работало! На этом же компе, с этой же виндой и делфи. Проект тот не компилил года 2-3, а тут достал внести маленькое изменение, а оно AV стало выдавать... может обнова винды какая сыграла роль, ибо все остальное осталось прежним.. ну да ладно, переделаю уже "по-взрослому" :)
ёёёёё
Дата: 20.12.2019 10:58:23
LiYing
Чесслово, работало!

Небось, с глобальными объектами работала enum процедурка, или в контексте объекта, адрес которой передавался во втором параметре, а ты в лоб локальный добавил, или вообще поле объекта.
LiYing
Дата: 20.12.2019 11:02:52
ёёёёё,

да нет же! Просто попытался скомпилировать старый проект, ранее 100% рабочий, а тут AV... ничего не менял вообще.
alekcvp
Дата: 20.12.2019 11:17:28
ёёёёё
LiYing
Чесслово, работало!

Небось, с глобальными объектами работала enum процедурка, или в контексте объекта, адрес которой передавался во втором параметре, а ты в лоб локальный добавил, или вообще поле объекта.

В тот раз просто так регистры сошлись... а в этот не сошлись
Тут гулял по инету модуль Base64, где автор в ассемблерной процедуре вместо EDX считывал второй параметр из EBX - и ничего, в 9 их 10 случае работало... почему-то :)
LiYing
Дата: 20.12.2019 13:40:31
GunSmoker,

Вот спасибо, очень познавательно!