我正在从头开始设计模块化软件基础架构,其中不同的DLL包含不同的业务逻辑和应用程序逻辑。每个DLL都有自己的初始化/未初始化机制,通过常见的DLL调用。
假设我有一个使用这些不同DLL的主机应用程序。所有这些DLL都由主机应用程序通过LoadLibrary
加载和初始化。当一个DLL初始化时,它会实例化一些内部全局变量。我可以使用另一个DLL连接到这个并访问同一个实例而无需通过主机路由吗?当然从另一个DLL中调用LoadLibrary
会创建另一个实例,直接调用DLL也不会被初始化/实例化?
如何从一个DLL访问由同一主机应用程序初始化的另一个DLL的实例化数据?
例如,数据库连接。我使用提取/执行等方法在一个DLL中封装ADO连接。我希望一个DLL使用从此DB DLL中的主机应用程序实例化的相同连接。
答案 0 :(得分:3)
库(DLL模块)在进程内共享。库的全局变量只有一个实例。在已加载的DLL上调用LoadLibrary时,将返回已加载模块的模块句柄。单个DLL只能加载一次进程。
因此,使用LoadLibrary然后调用该库的函数完全没问题。
作为替代方案,如果您确定已加载库,则可以使用GetModuleHandle。例如,您永远不需要为kernel32调用LoadLibrary,因为它总是被加载。
答案 1 :(得分:0)
有关如何通过共享内存映射文件执行此操作的示例,请参阅this article。