在Delphi XE2中从dll调用过程

时间:2014-11-14 18:23:36

标签: windows delphi dll delphi-xe2 procedure

所以,我试图从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;

2 个答案:

答案 0 :(得分:6)

一个错误是您在加载dll时指定 DllHandle ,但是检查处理&lt;&gt;零。句柄实际上是你的表单句柄,其中的句子不是零。如果加载成功则无关紧要,但如果失败,则会出现错误的日志记录。 由于您还有一些日志记录功能,日志会显示什么?

答案 1 :(得分:3)

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

注意名称装饰和信件案例。 C和C ++ DLL可以导出装饰名称。导出的名称对字母大小写很敏感。

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

供参考,当GetProcAddress失败时,正如文档所述,对GetLastError的调用将产生错误代码。


看起来另一个答案就是某些东西。您认为已正确加载DLL,但您的代码未正确执行该检查。

如果您拨打了GetLastError,系统可能会提醒您。如果您在调试器下检查了变量,那么问题就很明显了。