【发布时间】: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