Проблема в том, что вы сделали EnumRCDataProc
локальной процедурой.Вы должны переместить его за пределы метода.
function EnumRCDataProc(hModule: HMODULE; lpszType, lpszName: PChar; lParam:
NativeInt): BOOL; stdcall;
begin
TStrings(lParam).Add(lpszName);
Result := True;
end;
procedure TForm2.Button1Click(Sender: TObject);
var k: NativeInt;
L: TStringList;
H: HMODULE;
begin
H := LoadPackage('resource.bpl');
L := TStringList.Create;
try
EnumResourceNames(H, RT_RCDATA, @EnumRCDataProc, NativeInt(L));
ShowMessage(L.Text);
finally
L.Free;
UnloadPackage(H);
end;
end;
При первой проверке я ожидал, что компилятор выдаст ошибку с вашим кодом:
E2094 Локальная процедура / функция 'Обратный вызов'присваивается переменной процедуры
Но это не так.Я покопался немного глубже и обнаружил, что параметр обратного вызова для EnumResourceNames
объявлен как тип Pointer
.Если бы перевод заголовка объявил это как типизированный параметр обратного вызова, то вышеприведенное сообщение об ошибке действительно было бы отправлено.На мой взгляд, перевод заголовка плох в этом отношении.Кажется, очень мало чего можно добиться, отказавшись от безопасности системы типов.
Тот факт, что ваш код работает в 32-битном коде, является просто счастливым совпадением, основанным на деталях реализации.Ваша удача заканчивается на 64 бит.Опять же, если бы система проверки типов была включена, компилятор мог бы сразу сказать вам, что было не так.
Некоторые другие комментарии:
- В
EnumRCDataProc
есть пара неверныхТипы в своем объявлении: hModule
должен иметь тип HMODULE
, а результат функции должен быть BOOL
. LoadPackage
- довольно тяжелый подход к получению дескриптора модуля.Я предпочел бы видеть LoadLibraryEx
с опциями LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
и LOAD_LIBRARY_AS_IMAGE_RESOURCE
.