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

Mar*_* Ba 4 windows dll winapi loadlibrary visual-c++

帮助解释MSDN

动态链接库搜索顺序

...

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

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

考虑:

...\x\foo.exe
...\x\a\bar.dll ~ no further dependencies
...\x\b\bar.dll ~ no further dependencies
Run Code Online (Sandbox Code Playgroud)

是否可以通过显式加载库调用将这两个都加载bar.dllfoo.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 ...
Run Code Online (Sandbox Code Playgroud)

Har*_*ton 5

从文档(重点是我的):

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

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

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

因此,提供完整路径时,您担心的子句将不适用。

  • [LoadLibrary](https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms684175%28v=vs.85%29.aspx)的“备注”部分也有一个子句“ If * lpFileName *如果不包含路径,并且有多个具有相同基本名称和扩展名的已加载模块,则该函数将返回首先加载的模块的句柄。”,如果无法通过以下方式加载多个DLL,则将毫无意义。相同的文件名。 (2认同)