想象一下下面的场景:
My Program -> lib A -> lib B -> lib C
我有我的库A,它加载库B,它加载库C。我有源代码,可以修改库A,但我不能修改库B和C。库C有一个问题:它包含一个单例,提供了我需要的功能(网络连接到设备)。但是,如果我想一次连接到更多的设备,我不能,因为库不是为它而做的。
当我生成多个进程,每个进程都有自己的A.DLL句柄时,一切都正常(我从一台机器上同时连接到多个设备)。然而,我想从一个进程连接到多个设备,因为我的程序和我的库A之间需要通信,我不想通过昂贵的进程间通信来解决这个问题(尽管这应该是可能的,只是缓慢而复杂)。
我发现,Windows加载DLL多次,如果是在不同的地方.所以我复制我的库在两个目录,libs 1和libs 2.我然后加载libs1/A.DLL和libs2/A.DLL.当我检查进程资源管理器,我看到A.DLL实际上是加载了两次,这是伟大的.我试图解决的主要问题是,当我加载第二个A.DLL,Windows不会从第二个目录再次加载B.DLL和C.DLL,因为它们已经加载了。而且我需要多个C.DLL示例。
要从程序中加载我的A.DLL库,我使用LoadLibrary()和SetDllDirectory()强制Windows在libs 1/libs 2文件夹中查找。
1条答案
按热度按时间oewdyzsn1#
所有三个A.DLL、B.DLL和C.DLL都应位于不同的位置。每次加载A.DLL时,请在
SetDllDirectory()
中指定此不同的位置。