【问题标题】:Declaring a DLL inside a Delphi XE5 component在 Delphi XE5 组件中声明 DLL
【发布时间】:2017-05-26 01:01:35
【问题描述】:

我正在 Delphi 中创建一个新组件,它实例化一个 DLL

Unit UMyComponent

interface

type
  TMyComponent = class(TComponent)
    ... 
    procedure MyDllCall; 
  end;

procedure Register;

implementation

function MyDll: Longint; stdcall; external 'MyDllName.dll' name 'MyFunction'

procedure TMyComponent.MyDllCall;
var
  res: LongInt;
begin
  res:= MyDll;
end;

...

procedure Register;
begin 
 RegisterComponents('My Tab', [TMyComponent]); 
end;

end.

我有两个问题:

  1. 当我在 IDE 上安装组件时,它会搜索物理 DLL,如果在路径中找不到它会给出错误。我希望组件在运行时有效使用时查找它。
  2. 是否可以在运行时设置 dll 库文件名?即:“MyDllName.dll”可以更改为“10029.dll”或“ajjdwawd.dll”

请注意,我将 DLL 声明放在实现中,以免将函数调用暴露给调用者。

感谢您的回答。

【问题讨论】:

  • LoadLibrary + GetProcAddress
  • 使用runtime linkingLoadLibraryGetProcAddressFreeLibrary)或delay loadingdelayed)。
  • 知道了,谢谢。欣赏。
  • 使用延迟和工作就像一个魅力。要在运行时更改 dll 名称,恐怕我必须使用 LoadLibrary。谢谢大家。
  • 如果您有新问题,请单击顶部的 按钮并编写新问题。编辑新信息以便在回答此问题后提出后续问题是不合适的。我已相应地回滚了您的编辑。

标签: delphi dll components


【解决方案1】:

您当前的代码使用所谓的load-time linking。必须在加载模块时解决依赖关系,否则将无法加载。您需要使用替代方法,run-time linking

在 Delphi 中有两种方法可以做到这一点:

  • 通过调用LoadLibraryGetProcAddressFreeLibrary直接使用Win32。
  • 让 Delphi RTL 使用 delayed 关键字为您执行此操作。

文档中更详细地介绍了这两种方法:

【讨论】:

  • 问题:实现了延迟加载和动态加载。虽然延迟工作正常,但动态的会导致 dll 崩溃并且应用程序关闭。我相信它与我传递给 DLL 的参数有关。它们是字符串并作为 PAnsiChar 传递。我以使用它的方式用参数更改了上面的帖子。您认为这与您的经历有关吗?
  • @Marco:如果您有一个新的、单独的问题,请使用 按钮并提出一个新问题。您在此处提出的问题已得到解答。
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 2017-05-13
  • 2021-12-18
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多