【问题标题】:How to make multiple DLL instances able to access each other?如何使多个 DLL 实例能够相互访问?
【发布时间】:2013-09-11 01:26:24
【问题描述】:

我正在从头开始设计一个模块化软件基础架构,其中不同的 DLL 拥有不同的业务逻辑和应用程序逻辑。每个 DLL 都有自己的通过通用 DLL 调用进行初始化/取消初始化的机制。

假设我有一个使用这些不同 DLL 的主机应用程序。所有这些 DLL 都由主机应用程序通过 LoadLibrary 加载和初始化。当一个 DLL 初始化时,它会实例化一些内部全局变量。我可以使用另一个 DLL 连接到这个 DLL 并在不通过主机路由的情况下访问同一个实例吗?肯定从另一个 DLL 中调用 LoadLibrary 会创建另一个实例,并且直接调用 DLL 也不会被初始化/实例化?

如何从一个 DLL 访问由同一主机应用程序初始化的另一个 DLL 的实例化数据?

例如,数据库连接。我用获取/执行等方法将 ADO 连接封装在一个 DLL 中。我希望一个 DLL 使用从该 DB DLL 中的主机应用程序实例化的相同连接。

【问题讨论】:

  • .. 将创建另一个实例.. - 如果您不释放库,则不会。可执行文件加载库后,其他库将使用已映射到可执行文件地址空间的实例。您可以通过导出的函数将全局数据导出到其他库和可执行文件,只要您不释放库,它就不会再次初始化。库不是自己运行的,它实际上是其中的可执行运行代码。
  • 澄清一下:加载已加载 DLL 的新可执行程序将重用相同的 CODE 但不使用相同的 DATA(除非它在 ​​SHARED 数据段中声明 - 这是 Delphi 不允许的定义)。

标签: delphi dll loadlibrary


【解决方案1】:

库(DLL 模块)在进程内共享。库的全局变量只有一个实例。当您在已加载的 DLL 上调用 LoadLibrary 时,将返回已加载模块的模块句柄。单个 DLL 只能在一个进程中加载​​一次。

因此,您可以使用 LoadLibrary 然后调用该库的函数。

如果您确定库已经加载,您可以使用 GetModuleHandle 作为替代方案。例如,您永远不需要为 kernel32 调用 LoadLibrary,因为它总是被加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2016-03-23
    • 1970-01-01
    • 2011-07-20
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多