Delphi Loadlibrary返回0(LastErrorcde = 3221225616)这是什么意思?

use*_*722 4 delphi dll winapi dllimport delphi-7

我需要在我们的主应用程序中使用第三方dll.当我静态链接到提供的DLL它工作正常,我可以DLL导出函数.但我们不希望我们的主应用程序在启动时依赖于此DLL,所以我尝试在需要时动态加载DLL:

DLLHandle := LoadLibrary('3rdparty.dll');
ret := GetLastError();
if DLLHandle = 0 then
begin
  err := SysErrorMessage(ret);
  Writeln(err);
end //...
Run Code Online (Sandbox Code Playgroud)

但确实不起作用:LoadLibrary函数返回0并且LastErrorcode是3221225616.因为我不知道我做错了什么我尝试在c中编码的相同(在同一台PC上)并且它可以工作:但是什么不是它与delphi一起工作?:我在同一个DLL上调用相同的LoadLibrary函数!

当我使用ProcMon监视时,我看到第三方dll被加载,并且第三方dll的dependand dll也被加载.:所以Windows肯定会找到DLL.但在某处它加载过程失败:当我尝试使用带有DONT_RESOLVE_DLL_REFERENCES或LOAD_LIBRARY_AS_DATAFILE的LoadLibraryEX加载DLL时,它也可以工作(但我不能在场外调用所需的函数......)

我没有想法:希望你们能帮助我...

thx in adv.克里斯托夫

And*_*and 10

这有用吗?

var
  SavedCW: word;

...

SavedCW := Get8087CW;
Set8087CW(SavedCW or $7);
DLLHandle := LoadLibrary('3rdparty.dll');
Set8087CW(SavedCW);
if DLLHandle = 0 then
begin
  ret := GetLastError();  
  err := SysErrorMessage(ret);
  Writeln(err);
end //...
Run Code Online (Sandbox Code Playgroud)

一些讨论:

在询问Google时,错误代码3221225616似乎是无效浮点运算的结果.现在,这似乎非常技术性; 实际上,加载库与浮点计算有什么关系呢?浮点控制字(CW)是一个位域,其中位指定处理器应如何处理浮点错误; 实际上,通过将这些位中的一个更改为1(顺便说一下是默认状态)可以处理意外的浮点错误.再举一个例子,看看我的这个问题,我得到了一个完全出乎意料的零误差除法,通过将控制字的"div by zero"位设置为1来处理.

  • Kristof:浮点控制字位控制(除其他外)FPU如何处理各种浮点错误 - 除零,溢出,下溢等.FPU可以忽略错误或引发硬件异常.大多数C/C++ RTL禁用FP异常.Delphi应用程序设置控制字以启用某些FP异常.您可以根据需要禁用FP异常,但要仔细考虑忽略错误的后果,这些错误实际上表明您的应用程序中存在错误的数据. (4认同)
  • 当应用程序加载时,DLL很快就会在进程中加载​​,很可能在Delphi RTL将8087控制字设置为它最喜欢的值之前.DLL可能希望8087控制字是操作系统的默认值. (3认同)

Cra*_*ntz 6

3221225616 = STATUS_FLOAT_INVALID_OPERATION.我的猜测是,你的Delphi和C应用程序中的FPU CW是不同的,并且你的DLL的初始化对此很敏感.


dth*_*rpe 6

可能相关:http: //discuss.joelonsoftware.com/default.asp?joel.3.88583.15

尝试在Delphi RTL中使用SafeLoadLibrary()而不是Win32 LoadLibrary.此函数在调用LoadLibrary之前保留FP控制字,并在LoadLibrary返回后将其设置回Delphi所需的值.