2008-10-06 206 views
27

我在WinXP下建立了一個.dll,聲稱它在加載時找不到DWMAPI.DLL。問題是這個DLL是一個Vista DLL,這是安裝了IE7的XP用戶的一個已知問題。建議您通過添加/刪除程序卸載IE7或修復.NET Framework。我做了修理,沒有任何改變。我不打算卸載IE7,因爲必須有更好的解決方案,這不等於「重新安裝Windows」。如何修復WinXP下的DWMAPI.DLL延遲加載依賴項?

我讀過關於試圖卸載IE7的人的壞消息,所以我不願走這條路。

我在Visual Studio 2003(7.1)下使用C++。我沒有看到可能在應用程序啓動時強制延遲加載的選項。我在創建DLL項目時只使用了默認設置。我剛剛找到了一個有趣的選項,Linker-> Input-> Delay Loaded DLL,所以我把DWMAPI.DLL放在那裏,強制延遲加載。然而,我在鏈接時得到這樣的:

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll 

..它當然試圖加載我的DLL時,並沒有改變任何事情。對此,我添加了導致DWMAPI.DLL的整個DLL樹,並且我得到了相同的消息。 (爲了記錄,它是foundation.dll-> shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll。)

更具體地說我在做什麼,我寫瑪雅插件並獲得腳本編輯器中總是有幫助的文字:

// Error: Unable to dynamically load : D:/blahblahblah/mydll.mll 
The specified module could not be found. 
// 
// Error: The operation completed successfully. 
// 
// Error: The operation completed successfully. 
(mydll) // 

我用的Dependency Walker最初追查問題,而這正是導致我dwmapi.dll文件。這些消息取決於給我,並dwmapi.dll文件是旁邊一個黃色的問號,它的唯一的事情:

Warning: At least one delay-load dependency module was not found. 
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. 

傑拉德是正確的。實際上,Maya使用與Dependency Walker不同的PATH。我的插件加載了另一個生活在Maya插件目錄中的DLL(用於圖像處理),並且依賴於找到它沒有問題,但是Maya沒有。我必須在Maya.env中添加「插件」到PATH中。

鑑於此問題與DWMAPI.DLL無關,但DWMAPI是一個常見問題,我將在Novell的網站here上發佈有關DWMAPI問題的最佳鏈接。基本上,大多數程序在depends.exe中都會有這個警告,但是如果在它旁邊有一個延遲加載圖標,並且您確定程序不會直接或間接調用DWMAPI,那就沒問題。問題在別處。如果延遲加載圖標不存在,則必須查看Visual Studio中的/ DELAY和/ DELAYLOAD選項。依賴的事實給了我一個「警告」,而不是「錯誤」是DWMAPI沒有被自動加載的事實的線索。

+1

我在其中一臺Windows 2003服務器上遇到此問題。這只是一個血腥的控制檯應用程序,但它(或其他一些依賴)聲稱也需要dwmapi.dll。我很想看到明確的答案。 +1。 – Kev 2008-10-06 07:34:28

+0

我認爲很多意見來自Google的驅動。只搜索「dwmapi.dll」將其作爲第二個結果。 – 2009-08-14 17:25:02

回答

7

根據您的更新問題,dwmapi.dll文件可能不是你的問題。無論何時鏈接到mshtml,依賴項步行者總是會給你這個錯誤,因爲它總是檢查延遲加載的DLL。

在這一點上我最好的猜測是,你有你的項目設置爲動態加載運行時庫和DLL的搜索路徑是由瑪雅改變。所以它可能無法找到MSVC運行時DLL(s)。我很長時間沒有開發Maya插件,但是我最近遇到了其他具有插件DLL的應用程序的問題。

嘗試用C更改設置/ C++ - >代碼發生 - >運行時庫多線程,而不是多線程DLL。

除此之外,你可以嘗試使用Dependency Walker中擺弄,使其作爲使用瑪雅相同的搜索路徑,看看您是否能想出另一個依賴性問題。

正如你可以在調試器啓動Maya和設置調用LoadLibrary一個斷點,並找出哪些庫沒有被加載這樣一個不得已而爲之。

+0

不是在線程上的一個死靈巫師,剛剛調試過這個相同的問題,我只是想添加一些東西。如果你發現你的dll是靜態鏈接的(正如Gerald所建議的那樣),並且你仍然遇到這個問題,用Visual Studio加載你的dll並檢查它的清單。如果項目是由其他人創建的,它們可能包含一個.manifest文件,它在二進制文件中嵌入了它的依賴關係,當操作系統找不到這些文件時,即使該DLL是靜態鏈接的,它也會聲稱存在問題。如果找到.manifest,請評論這些並重新編譯,它可能會解決問題。 – Decker 2010-05-20 21:03:19

3

這是一個棘手的問題。真的有兩種主要方式會導致這個錯誤。

1)您的項目設置爲強制延遲加載的DLL在應用程序啓動時加載。 DWMAPI.dll是一個延遲加載的DLL,因此通常不會被加載,除非它的一個函數被調用。這不會發生在XP上,除非你試圖在你的DLL中做到這一點。但是可以設置一個編譯器選項來強制你的應用程序加載延遲加載的DLL。如果你這樣做,不要。

2)當存在另一個問題時,您通常會從depend.exe中獲得一個錯誤的錯誤。通過依賴walker運行你的DLL,看看是否還有其他的依賴問題。如果一切都失敗,請嘗試卸載IE7並查看問題是否仍然存在。如果這是一個錯誤的錯誤,安裝IE7後,你會看到真正的錯誤。之後您可以再次安裝IE7。

3

我完全是這個問題。

偷偷摸摸的問題,要花好幾個小時來解決。

無論如何。我在釋放機器上編譯我的託管C++應用程序。得到了無法運行的客戶的投訴,在我們所有的機器上都起到了魅力。

原來,釋放機器自動修補一個晚上在一個月前與ATL漏洞修復,因此是所有其他機器也,除了一個XP的機器。

這particulare XP機器無法運行任何應用程序。安裝了ATL修復程序(請參閱下面的鏈接),而且每一件事情都像以前一樣工作。

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

所以教訓,經常檢查您的中間艙單(找到了調試或發佈目錄),這將告訴你該程序已與對DLL的是什麼版本。

希望它可以幫助任何人。

2

嘗試用C更改設置/ C++ - >代碼發生 - >運行時庫多線程,而不是多線程DLL。