假设第三方DLL X 有一个全局变量 G
我写了两个单独的DLL(作为应用程序的插件) P1 & P2 ,它们都动态加载 X 。
应用程序的进程加载我的两个插件 P1 & P2 ,因此两者都会同时加载。
这是否意味着我有一个 G 的实例或两个?
修改
使用场景是 X 是一个3D渲染引擎,它有单个包装系统资源,它根本不是设计为期望一个进程中的多个实例 - 你可以运行2 X 强大的基于应用程序的应用程序,但尝试在相同的应用程序中初始化 X 两次将陷入困境。 这些插件都使用 X 但是将作为单独的安装程序部署,它们不彼此了解并且不会共享相同的 X 。 dll文件 - 通常每个插件都有自己的目录,用于存储所需的资源和DLL。
答案 0 :(得分:3)
在Win32 API中公开的DLL加载例程确保每个进程只加载一个DLL副本(see the "Remarks" section here,特别是第3段和安全备注部分之前的最后一段,其中每个进程引用计数被讨论)。我假设你只是在调用LoadLibrary
或类似的,在这种情况下你有一个G的实例。
看起来似乎 可能通过在不同位置(as noted in this sort-of related question)拥有相关DLL的多个副本并加载其中的每个副本来绕过这一点,在这种情况下,可能最终会得到每个DLL中所有数据的多个副本(包含G)。
答案 1 :(得分:0)
答案是每个进程中都有一个全局变量实例。这些都在MSDN上解释:Dynamic-Link Library Data