2012-05-10 62 views
0

我的程序使用LoadLibrary動態地加載了一些DLL,並且(在字面上所有機器上)這些加載成功,在一臺機器上這些DLL的某些內容不會被加載。我添加了跟蹤lasterror的代碼,並報告「0x43找不到網絡名稱」。LoadLibrary失敗,出現lasterror 0x43無法找到網絡名稱

有問題的機器運行Windows 7 Enterprise x64,該DLL是一個32位的DLL,這不應該是一個問題,並且(事實上)這是我的開發環境。

我也嘗試將DLL(其中包括路徑)的名稱轉換爲短文件名,並在調用LoadLibrary中使用它,我仍然有同樣的錯誤。

任何想法?

// * eggbox

+1

LoadLibrary有一個[複雜的搜索路徑算法](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx),可能無效的網絡路徑已經結束了搜索路徑? – Benj

+0

提供給LoadLibrary的文件名是完全限定的,例如C:\ Program Files(x86)\ MyApp \ DLLs \ AssetModule.dll或短名稱版本。 – eggbox

+0

當然,但是它依賴的庫呢? – Benj

回答

2

下載Procmon讓它運行和過濾爲您DLL名稱。這會立即爲您提供搜索dll的位置以及哪個訪問路徑返回0x43。

如果您還有代碼的pdbs(C/C++只有沒有託管代碼),您甚至可以調用堆棧。

+0

感謝您的提示,我會用我的系統嘗試一下,看看我能否看到與用戶系統的不同。 – eggbox

+0

Procmon確實給了我一些指向無法加載依賴DLL的信息。奇怪的是,依賴DLL是在加載失敗之前立即加載的。至少我現在有些事情要繼續,謝謝你的幫助。 – eggbox

+0

只是爲了讓大家知道我發現了什麼事情。客戶在他們的路徑聲明中有一條指向網絡共享的條目,例如** \\ machine \ folder \ subfolder **,它看起來像無法訪問(因此是錯誤代碼)。 **修正**是爲了從他們的路徑中刪除條目,簡單但真正令人沮喪。 – eggbox

0

在配置文件模式下通過Dependency Walker運行該程序,並讓該精細工具告訴您到底發生了什麼問題。

+0

我在配置文件模式下嘗試了Dependency Walker,但對於x86和x64機器來說,它永遠都不會加載(在我的系統上)。不錯的主意。 – eggbox

+0

這不是發生錯誤時會發生什麼嗎? –

+0

大衛,我在我的開發機器上試過這種情況,通常情況下它會成功加載,並且它永遠不會結束。 – eggbox

相關問題