在Delphi XE2 Win32平台上运行以下代码可以正常工作。然而,在 win64 平台上编译的相同代码如果在调试模式下运行,将导致“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 本地过程/函数“回调”分配给过程变量
但它并没有这样做。我挖得更深一点,发现回调参数EnumResourceNames
被声明为类型Pointer
。如果标头翻译已将其声明为类型化回调参数,则确实会发出上述错误消息。在我看来,标题翻译在这方面很差。放弃类型系统的安全性似乎没有什么好处。
您的代码在 32 位代码中运行这一事实只是一个依赖于实现细节的巧合。你的运气在 64 位上就耗尽了。同样,如果类型检查系统已启用,编译器可以立即告诉您出了什么问题。
其他一些评论:
- The
EnumRCDataProc
其声明中有几个不正确的类型:hModule
应该是类型HMODULE
函数结果应该是BOOL
.
-
LoadPackage
是获取模块句柄的相当重量级的方法。我更愿意看到LoadLibraryEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx与LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
and LOAD_LIBRARY_AS_IMAGE_RESOURCE
选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)