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来处理.
可能相关:http: //discuss.joelonsoftware.com/default.asp?joel.3.88583.15
尝试在Delphi RTL中使用SafeLoadLibrary()而不是Win32 LoadLibrary.此函数在调用LoadLibrary之前保留FP控制字,并在LoadLibrary返回后将其设置回Delphi所需的值.