【问题标题】:Calling procedure from dll in Delphi XE2在 Delphi XE2 中从 dll 调用过程
【发布时间】:2014-11-14 18:23:36
【问题描述】:

所以,我试图从 Delphi XE2 中的 DLL 调用一个过程。 但程序不会分配。

我尝试了几个在 Internet 上找到的示例。 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;

【问题讨论】:

  • 假设您发布的代码正是您正在测试的内容...您设置了 DLLHandle,但随后测试了Handle &lt;&gt; 0...也许是您的 DLL 本身无法加载。
  • ooohhh 现在我明白了。我什至没有注意到这一点。

标签: windows delphi dll delphi-xe2 procedure


【解决方案1】:

一个错误是您在加载 dll 时分配了 DllHandle,但随后您检查是否 Handle nil。句柄实际上是您的表单句柄,当然不是零。如果加载成功,这无关紧要,但如果加载失败,您将得到错误的日志记录。 既然你也有一些日志功能,那么日志显示什么?

【讨论】:

    【解决方案2】:

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

    注意姓名装饰和字母大小写。 C 和 C++ DLL 可以导出修饰名称。并且导出的名称对字母大小写敏感。

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

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


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

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

    【讨论】:

    • 但是我该如何使用dumpbin呢?我以前从未听说过它
    • 它是 MS 工具之一。 Dependency Walker 更易于使用。
    • @MartynA 名字就是名字。如果tdump 得到导出的名称,那很好。我只是碰巧使用了其他工具。 Depends 有一个让某些人感到欣慰的 GUI。
    • 出口在那里。但仍然无法正常工作?我的代码有问题吗?
    • 如果 GetProcAddress 返回 nil 则不会从您加载的 DLL 中导出该名称的函数。就是这么简单。要么您加载了错误的 DLL,要么您输入了错误的名称。让我们明确一点,“不工作”是不精确的。我在答案中陈述了我的假设。我做对了吗?在问题中,您没有说明程序的输出。
    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2023-03-17
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多