Ejecutando el siguiente código en la plataforma Delphi XE2 Win32 funciona. Sin embargo, el mismo código compila en la plataforma Win64 hará que el acceso violación en "EnumRCDataProc" si se ejecuta en modo de depuración:Delphi XE2: Invocar WinAPI EnumResourceNames causa violación de acceso en la plataforma Win64
procedure TForm2.Button1Click(Sender: TObject);
function EnumRCDataProc(hModule: THandle; lpszType, lpszName: PChar; lParam:
NativeInt): Boolean; stdcall;
begin
TStrings(lParam).Add(lpszName);
Result := True;
end;
var k: NativeInt;
L: TStringList;
H: THandle;
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;
Cuando depurar el código en Delphi XE2 IDE en la plataforma Win64, encontré el valor de hModule en EnumRCDataProc no coincide con la variable H. Sospecho que puede haber algún problema con los parámetros que construí para EnumRCDataProc. Sin embargo, no puedo entender cómo. ¿Algunas ideas?
El compilador no debería quejarse de eso. La función enum local no es un problema en absoluto. – OnTheFly
Adivina por qué emite eso: p – OnTheFly
Siempre que la devolución de llamada no acceda a ningún formulario, eso no debería ser un problema. Por otra parte, solo para ese propósito, tomar la devolución de llamada es lo correcto. ¿Qué significa el exceso de ataque? ¿Eso anula la parte de la respuesta anterior? –