一个进程中能否加载两个同名的DLL?

9
我正在谈论win32 dlls,那些普通的pe文件。在与我在explorer.exe进程中看到的内容进行比较后,我感到困惑。
以下是我的测试模块(C++): 1. DLLLoader.exe链接到同一文件夹中的A.dll。 2. B.dll链接到另一个文件夹中的A.dll(2)。(A.dll(2)是一个完全不同的DLL,但名称相同) 3. DLLLoader.exe将通过::LoadLibrary显式加载B.dll。 现在我启动DllLoader.exe,首先加载A.dll,但当它尝试加载B.dll时,它就失败了:我怀疑这是因为B.dll认为A.dll已经加载到进程中,但实际上加载的不是B.dll想要的那个,导入/导出表无法匹配,因此B.dll无法加载。 这似乎告诉我们,在同一进程中不能加载两个名称相同的dll,即使它们的路径不同。
但是,当我使用进程资源管理器监视Windows的explorer.exe进程中加载的模块时,我可以看到以下两个具有相同名称的dll被加载: comctl32.dll 用户体验控件库 C:\WINDOWS\WinSxS...\comctl32.dll comctl32.dll 通用控件库 C:\WINDOWS\system32\comctl32.dll
请问有人能给我一些指导吗?
2个回答

8
基本上是取决于您是否加载了完整路径的dll文件或仅通过文件名进行加载。 LoadLibraryEx文档已经很好地覆盖了这一点:
如果lpFileName不包含路径,并且有多个已加载具有相同基本名称和扩展名的模块,则该函数返回对首次加载的模块的句柄。

为了实现隐式加载(基于 DLL 依赖项),我们只能加载一个具有相同名称的 DLL。 - Baiyan Huang

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接