所以,我试图从Delphi XE2中的DLL调用一个过程。 但程序不会分配。
我尝试过在互联网上找到的几个例子。 正在按预期加载DLL。 出口写得正确。
一切似乎都很好,但仍然没有成功。
这是怎么回事?
我的代码如下
type
TStarter = procedure; stdcall;
...
fTheHookStart: TStarter;
...
procedure TForm1.LoadHookDLL;
begin
LogLn('Keyboard Hook: Loading...');
// Load the library
DLLHandle := LoadLibrary('thehookdll.DLL');
// If succesful ...
if Handle <> 0 then
begin
LogLn('Keyboard Hook: DLL load OK!');
LogLn('Keyboard Hook: assigning procedure ...');
fTheHookStart := TStarter(GetProcAddress(DLLHandle, 'StartTheHook'));
if @fTheHookStart <> nil then
begin
LogLn('Keyboard Hook: procedure assignment OK!');
LogLn('Keyboard Hook: Starting...');
fTheHookStart;
end
else
begin
LogLn('Keyboard Hook: procedure assignment FAIL!');
FreeLibrary(DLLHandle);
if Handle <> 0 then LogLn('Keyboard Hook: DLL free OK!') else LogLn('Keyboard Hook: DLL free FAIL!');
end;
end
else
begin
LogLn('Keyboard Hook: DLL load FAIL!');
end;
end;
答案 0 :(得分:6)
一个错误是您在加载dll时指定 DllHandle ,但是检查处理&lt;&gt;零。句柄实际上是你的表单句柄,其中的句子不是零。如果加载成功则无关紧要,但如果失败,则会出现错误的日志记录。 由于您还有一些日志记录功能,日志会显示什么?
答案 1 :(得分:3)
据我了解,DLL加载,但GetProcAddress
返回nil
。只有一种这样的故障模式。 DLL不会导出具有该名称的函数。
注意名称装饰和信件案例。 C和C ++ DLL可以导出装饰名称。导出的名称对字母大小写很敏感。
使用dumpbin
或Dependency Walker检查导出的函数名称。
供参考,当GetProcAddress
失败时,正如文档所述,对GetLastError
的调用将产生错误代码。
看起来另一个答案就是某些东西。您认为已正确加载DLL,但您的代码未正确执行该检查。
如果您拨打了GetLastError
,系统可能会提醒您。如果您在调试器下检查了变量,那么问题就很明显了。