我说的是win32 dll,那些普通的pe文件。与我在explorer.exe进程中看到的相比,我在进行测试后感到困惑。
我用以下模块编写了一个测试:(C ++)
DLLLoader.exe链接到同一文件夹中的A.dll
B.dll链接到另一个文件夹中的A.dll(2)。 (A.dll(2)是与A.dll完全不同的DLL,但具有相同的名称)
DLLLoader.exe将通过:: LoadLibrary显式加载B.dll
现在我启动DllLoader.exe,首先,A.dll将被加载,但是当它尝试加载B.dll时,它只是失败了:我怀疑是因为B.dll认为A.dll已经加载了进程,但是实际上,加载的一个不是B.dll想要的那个,导入/导出表不能匹配,所以B.dll无法加载。
这似乎告诉我们,我们不能在同一个进程中加载2个同名的dll,即使它们的路径不同。
但是当我使用进程资源管理器来监视Windows的explorer.exe进程中加载的模块时,我可以看到下面的两个dll被加载,名称相同:
comctl32.dll用户体验控件库C:\ WINDOWS \ WinSxS ... \ comctl32.dll
comctl32.dll公共控件库C:\ WINDOWS \ system32 \ comctl32.dll
你们中间有人可以对此有所了解吗?
答案 0 :(得分:6)
如果您使用完整路径加载dll或仅使用文件名加载dll,它基本上取决于它。 LoadLibraryEx文档非常清楚:
如果lpFileName不包含路径 并且有多个已加载 模块具有相同的基本名称和 扩展,函数返回一个 处理已加载的模块 第一
答案 1 :(得分:6)
请参阅http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/,了解如何通过激活上下文(清单)隐式为WinXP及其实现此操作来控制加载。