gpt4 book ai didi

德尔福XE2 : Invoke WinAPI EnumResourceNames cause access violation in Win64 platform

转载 作者:行者123 更新时间:2023-12-03 15:11:56 25 4
gpt4 key购买 nike

在Delphi XE2 Win32平台上运行以下代码可以正常工作。但是,在 win64 平台上编译的相同代码如果在 Debug模式下运行,将导致“EnumRCDataProc”中的访问冲突:

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;

在Win64平台上的Delphi XE2 IDE中调试代码时,我发现EnumRCDataProc中的hModule值与变量H不匹配。我怀疑可能是我为EnumRCDataProc构造的参数有问题。但是,我不知道如何。有什么想法吗?

最佳答案

问题在于您已将 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 Local procedure/function 'Callback' assigned to procedure variable

但事实并非如此。我更深入地研究了一下,发现 EnumResourceNames 的回调参数被声明为 Pointer 类型。如果 header 翻译已将其声明为类型化回调参数,则确实会发出上述错误消息。在我看来,标题翻译在这方面很差。放弃类型系统的安全性似乎没有什么好处。

您的代码在 32 位代码中运行这一事实只是一个依赖于实现细节的巧合。你的运气在 64 位上就耗尽了。同样,如果类型检查系统已启用,编译器可以立即告诉您出了什么问题。

其他一些评论:

  1. EnumRCDataProc 的声明中有几个不正确的类型:hModule 应该是 HMODULE 类型,函数结果应该是 > bool
  2. LoadPackage 是一种获取模块句柄的相当重量级的方法。我更愿意看到LoadLibraryEx使用 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVELOAD_LIBRARY_AS_IMAGE_RESOURCE 选项。

关于德尔福XE2 : Invoke WinAPI EnumResourceNames cause access violation in Win64 platform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com