Delphi 11,64位本地化问题

bn31dyow  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(306)

我用的是 Delphi 11我有一个应用程序,我编译32或64位目标。
为了本地化我的应用,我使用这段代码在启动时加载我的语言文件。

LoadResStringFunc := nil; // Disable strings caching

    NewInstance := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE); 
    ....
    LibModuleList.ResInstance := NewInstance;

FileName是一个DLL文件,其中包含已转换的资源(RCDATA和“字符串表”)。似乎这个文件是一个32位的DLL无论32/64位输出的exe文件选择。
它可以很好地与32位图像exe文件,但不工作了与应用程序编译为64位应用程序。错误代码是0XC 0000005访问冲突

LibModuleList.ResInstance := NewInstance;

设置,并且任何对system.pas中LoadResString()的调用。似乎记忆完全被破坏了。它突然出现(或者我不记得是什么原因造成的)。它使用64位exe文件生成。我完全重新设置了翻译项目从头开始(保持以前的当前一个放在一边),我仍然有同样的问题。我花了很多时间试图弄清楚这一点,但没有成功。什么会导致这种情况?

kuhbmx9i

kuhbmx9i1#

所以我找到了罪魁祸首…在排队

Var NewInstance:Longint

 NewInstance := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);

改成

Var NewInstance:NativeInt; // Better for 64 bits ...

 NewInstance := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);

当Windows决定为我提供一个大于32位的句柄时,它已经与NewInstance一起工作了多年。这是因为最近Windows更新!我是怎么找到这个的?通过将{$R+},这应该一直启用。尽管这样比较慢。另一个恼人的事情是,与本地化,当内联变量声明使用;“提取资源字符串”不再工作了,这真的很糟糕。Remi,加载DLL编译与32位编译器有关RCdata和String的工作肯定。这不是一个人会期望的,但这是一个例外看起来像。

相关问题