在Delphi XE5组件中声明一个DLL

3
我正在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声明放在实现中,以便不向调用者公开函数调用。
谢谢回答。

1
LoadLibrary + GetProcAddress - kami
2
可以使用运行时链接 (LoadLibrary, GetProcAddress, FreeLibrary) 或者 延迟加载 (delayed)。 - David Heffernan
明白了,谢谢。感激不尽。 - Marco Carboni
使用延迟加载,效果非常好。要在运行时更改dll名称,恐怕我必须使用LoadLibrary。谢谢大家。 - Marco Carboni
1
如果您有一个新问题,请点击顶部的“提问”按钮并编写一个新问题。在此之后编辑新信息以提出后续问题是不合适的。我已相应地回滚了您的编辑。 - Ken White
1个回答

4

你目前的代码使用了加载时链接,模块必须在加载时解析依赖项,否则会加载失败。你需要使用另一种方法,运行时链接

在Delphi中,有两种方法可以实现:

  • 直接调用Win32函数LoadLibrary, GetProcAddressFreeLibrary
  • 使用delayed关键字让Delphi RTL为你完成。

这两种方法都在文档中有更详细的介绍:


问题:已经实现了延迟和动态加载。虽然延迟加载正常工作,但动态加载会导致dll崩溃并关闭应用程序。我认为这与我传递给DLL的参数有关。它们是字符串并作为PAnsiChar传递。我已更改上面的帖子,以使用一种新的参数方式。在您的经验中,您认为这可能与此有关吗? - Marco Carboni
1
@Marco:如果你有一个新的、独立的问题,那么请使用“提问”按钮并提出一个新的问题。你在这里提出的问题已经得到了回答。 - Ken White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接