【问题标题】:Load two instances of the same DLL in Delphi在 Delphi 中加载同一个 DLL 的两个实例
【发布时间】:2010-04-20 13:40:33
【问题描述】:

这是我的问题:我想为同一个 DLL 创建两个单独的实例。

以下不起作用,因为 Handle1 和 Handle2 将获得相同的地址

  Handle1 := LoadLibrary('mydll.dll');
  Handle2 := LoadLibrary('mydll.dll');

以下工作,但我必须制作 DLL 的副本并将其重命名为其他名称(这似乎有点傻)

  Handle1 := LoadLibrary('mydll.dll');
  Handle2 := LoadLibrary('mydll2.dll');

有没有办法只拥有一个 DLL 文件,但加载它的多个实例?

【问题讨论】:

  • 你为什么要这样做? DLL 是否保存了您想要两个不同副本的某种内部状态?
  • 我的猜测是第一次尝试不起作用,因为如果 DLL 已经打开,LoadLibrary 将返回一个现有句柄。
  • 我必须和 Mason Wheeler 一起去问:你想用它来实现什么。如果你成功了(就像你的第二个例子),你最终会在内存中得到两倍的相同代码。对我来说,这似乎也有点傻。
  • @Mason 和 Uwe:拥有一个不会让您拥有它提供的服务的多个实例的第 3 方 dll 将是想要 Tom 所要求的一个很好的理由。
  • Mason 和 Uwe:是的,dll 包含来自数据库的某些已处理信息。这两个 dll 连接到不同的数据库并具有不同的信息。我正在尝试在他们之间交换信息

标签: delphi dll loadlibrary


【解决方案1】:

我认为这是不可能的。

您必须编写一个加载 dll 的 .exe。然后,您可以跨越多个进程(.exe),每个进程都将运行自己的 dll 实例。您必须使用 IPC(进程间通信)技术与 .exe 进行通信。当然可行,但并非完全没有道理。

【讨论】:

  • 这是最安全、最正式的方法,无需借助较低级别的黑客攻击。
【解决方案2】:

它不适用于 LoadLibrary,因为 Windows 会检查 dll 是否已经加载,并且会一次又一次地返回相同的句柄。

我有一些代码原本是为了从绑定到可执行文件的资源中加载 dll,但我想也可以对填充了文件内容的内存区域执行相同的操作。我看不出它为什么不能工作两次的任何原因,但我还没有测试过。

您可以在这里找到它: http://svn.berlios.de/viewvc/dzchart/utilities/dzLib/trunk/src/u_dzResourceDllLoader.pas?view=markup

它是我的库 dzlib 的一部分,在 MPL 下可用。

【讨论】:

    【解决方案3】:

    Windows XP 为 Win32 DLL 引入了并行执行(these guys 对此了解很多)。

    现在您可以使用很多箍:

    【讨论】:

    • 加载同一个 dll 两次的例子是通过对一个实例使用 COM 和对另一个实例使用 LoadLibrary 来实现的。虽然很有趣,但在这种情况下可能不太实用。
    • @Lars:这是我发现的唯一可行的方法。所以:如果你真的需要,请定义“实用”:-)
    猜你喜欢
    • 2016-03-30
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多