2014-11-14 106 views
-2

所以,我想从Delphi XE2中的一个DLL中调用一个过程。 但程序不会分配。在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; 
+3

假设您发布的代码正是您正在测试的内容...您设置了DLLHandle,然后测试了“Handle <> 0”...可能是您的DLL本身无法加载。 – 2014-11-14 20:13:36

+0

oooohhh现在我明白了。我甚至没有注意到这一点。 – xaid 2014-11-14 22:02:58

回答

6

一个错误是分配DllHandle当你加载DLL,但你是否手柄 <>为零。句柄实际上是你的表格句柄,当然不是零。如果加载成功,则无关紧要,但如果失败,则会导致错误的日志记录。 由于您也有一些日志记录功能,日志显示了什么?

+0

Aaaaah我现在看到。谢谢我没有注意到这一点。 – xaid 2014-11-14 22:03:29

3

据我了解,该DLL加载,但GetProcAddress回报nil。只有一种这样的故障模式。该DLL不会导出具有该名称的函数。

小心名字装饰和信箱。 C和C++ DLL可能会导出装饰名称。导出的名字对字母大小写敏感。

使用dumpbin或Dependency Walker检查导出的函数名称。

仅供参考,如GetProcAddress发生故障,如文档说明,致电GetLastError将产生错误代码。


它看起来像其他答案是东西。你相信你已经正确地加载了DLL,但是你的代码没有正确地执行这个检查。

如果您叫过GetLastError,那么系统已经警惕过您。如果您在调试器下检查了这些变量,问题就会很明显。

+0

但是如何使用dumpbin?我从来没有听说过它 – xaid 2014-11-14 18:54:43

+0

这是MS工具之一。依赖Walker更容易使用。 – 2014-11-14 19:00:22

+0

@MartynA名称是一个名称。如果'tdump'获得导出名称,那很好。我只是碰巧使用其他工具。取决于具有一些令人欣慰的GUI。 – 2014-11-14 19:10:01