我们可以在一个进程中加载​​2个具有相同名称的DLL

时间:2009-08-27 13:12:11

标签: dll process

我说的是win32 dll,那些普通的pe文件。与我在explorer.exe进程中看到的相比,我在进行测试后感到困惑。

  1. 我用以下模块编写了一个测试:(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,即使它们的路径不同。

  2. 但是当我使用进程资源管理器来监视Windows的explorer.exe进程中加载​​的模块时,我可以看到下面的两个dll被加载,名称相同:
    comctl32.dll用户体验控件库C:\ WINDOWS \ WinSxS ... \ comctl32.dll
    comctl32.dll公共控件库C:\ WINDOWS \ system32 \ comctl32.dll

  3. 你们中间有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:6)

如果您使用完整路径加载dll或仅使用文件名加载dll,它基本上取决于它。 LoadLibraryEx文档非常清楚:

  

如果lpFileName不包含路径   并且有多个已加载   模块具有相同的基本名称和   扩展,函数返回一个   处理已加载的模块   第一

答案 1 :(得分:6)

请参阅http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/,了解如何通过激活上下文(清单)隐式为WinXP及其实现此操作来控制加载。