从我读的MSDN documentation,我认为(如果该基名的dll是尚未加载)传递完全限定的绝对文件名到LoadLibraryExW
只会查看该路径。LoadLibraryEx忽略完全归档的路径名?
E.g. (请注意,这是正确的CSIDL_SYSTEM的路径,如果有差别),如果该文件不存在该位置
LoadLibraryExW (L"C:\\Windows\\System32\\foobar.dll", LOAD_LIBRARY_AS_DATAFILE);
应该失败。但是我得到了一些有趣的结果,这让我认为它取得了基本名称并将它应用于Windows 8.1上的PATH
。并在其他地方找到具有相同名称的文件。
此外,如果我使用LOAD_LIBRARY_AS_DATAFILE
它阻止我发现它实际上找到它的位置。
这个功能是什么真的在这方面做了什么,并且它随操作系统版本而变化吗?
(顺便说一句,我知道LOAD_LIBRARY_SEARCH_SYSTEM32
,但这并不能在所有操作系统版本存在的。我想在任何运行早在XP)。
这是因为我觉得特别混乱,使用绝对路径是一个有效的修补程序,我以前看到它通过PATH找到不正确的文件,作为LOAD_LIBRARY_SEARCH_SYSTEM32
的便携式替代品。所以也许它会因操作系统或其他一些神奇的变化而改变行为。
您需要显示代码并提供完整详细的测试用例。尤其要注意,您链接的文档中提到的适用的“LOAD_”标志。 – dxiv
您可以使用Process Monitor(可从MS网站获得)来确认文件是否真的从其他地方加载。一个想法:你记得在路径中使用反斜杠,而不是正斜杠,对吧? –
我认为完全指定的DLL路径将来自另一个实际位置的情况是涉及Wow64重定向的情况。如果您的应用程序是运行在Win64操作系统上的32位应用程序,默认情况下,System32的文件访问权限将被重定向到SysWow64。见https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187.aspx也许这就是发生在你身上的事情?将路径更改为System32以外的其他路径,我认为您会看到LoadLibraryEx()函数失败。 –