代码之家  ›  专栏  ›  技术社区  ›  Baiyan Huang

我们可以在一个进程中加载两个同名的DLL吗

  •  7
  • Baiyan Huang  · 技术社区  · 16 年前

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

    1. 我用以下模块编写了一个测试:(C++)
      dllloader.exe链接到同一文件夹中的.dll。
      b.dll链接到另一个文件夹中的a.dll(2)。(a.dll(2)与.dll完全不同,但名称相同)
      dllloader.exe将通过::loadlibrary显式加载b.dll。
      现在我启动dllloader.exe,首先会加载a.dll,但当它试图加载b.dll时,却失败了:我怀疑是因为b.dll认为a.dll已经在加载过程中,但实际上加载的不是b.dll想要的,导入/导出表不匹配,所以b.dll加载失败。
      这似乎告诉我们不能在同一进程中加载两个同名的DLL,即使它们的路径不同。

    2. 但是,当我使用Process Explorer监视Windows的explorer.exe进程中加载的模块时,我可以看到以下两个同名的DLL正在加载:
      comctl32.dll用户体验控制库C:\windows\winsxs…\comctl32.dll
      comctl32.dll公共控件库C:\windows\system32\comctl32.dll

    你们中有人能把灯打开吗?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Mattias S    16 年前

    它基本上取决于您是用它的完整路径加载DLL,还是只按文件名加载。这个 LoadLibraryEx 文档很好地涵盖了这一点:

    如果lpfilename不包含路径 还有不止一个 具有相同基名称和 扩展,函数返回 加载模块的句柄 第一。

        2
  •  6
  •   puetzk    15 年前

    http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/ 为了更好地讨论如何通过激活上下文(清单)隐式地为winxp和up实现这一点,以控制加载。