從我讀的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()函數失敗。 –