一个进程可以加载两个名称完全相同的DLL吗?

时间:2017-04-04 20:55:39

标签: windows winapi visual-c++ dll loadlibrary

帮助解释MSDN

  

动态链接库搜索顺序

     

...

     

如果已经在内存中加载了相同模块名称的DLL ,则   系统在解析之前仅检查重定向和清单   加载的DLL,无论它在哪个目录中。系统   不搜索DLL

注意:基本上的多个具有相同名称的DLL 是一个坏主意,这只是为了获得更好的图片。

考虑:

...\x\foo.exe
...\x\a\bar.dll ~ no further dependencies
...\x\b\bar.dll ~ no further dependencies

是否可以使用显式加载库调用将这两个bar.dll加载到foo.exe中? 在哪里/如何记录和支持(否则我只是尝试它。)

也就是说,以下内容可以在Windows7 +上可靠地运行:

// Load using full path:
HANDLE a_mod = LoadLibrary(L"...\x\a\bar.dll");
HANDLE b_mod = LoadLibrary(L"...\x\b\bar.dll");
// now use moth DLLs ...

1 个答案:

答案 0 :(得分:5)

从文档(强调我的):

  

桌面应用程序可以通过指定完整路径,使用DLL重定向或使用清单来控制加载DLL的位置。 如果没有使用这些方法,系统会在加载时搜索DLL,如本节所述。

     

在系统搜索之前,它会检查以下内容:

     
      
  • 如果已在内存中加载了具有相同模块名称的DLL,则系统将使用加载的DLL,无论它在哪个目录中。系统不会搜索DLL。
  •   

因此,当您提供完整路径时,您所担心的条款并不适用。