2008-10-06 6 views
27

Ich habe eine .dll unter WinXP erstellt, die angibt, dass es DWMAPI.DLL nicht finden kann, wenn es geladen wird. Das Problem ist, dass diese DLL eine Vista-DLL ist, und dies ist ein bekanntes Problem für XP-Benutzer, die IE7 installiert haben. Die Empfehlung ist, IE7 zu deinstallieren oder das .NET Framework über Hinzufügen/Entfernen von Programmen zu reparieren. Ich habe die Reparatur gemacht, und nichts hat sich geändert. Ich bin nicht dabei, IE7 zu deinstallieren, da es eine bessere Lösung geben muss, die nicht "Windows neu installieren" entspricht.Wie behebt DWMAPI.DLL Verzögerung-Last-Abhängigkeit unter WinXP?

Ich habe schlechte Dinge über Leute gelesen, die versuchten, IE7 zu deinstallieren, also zögere ich, diese Route zu gehen.

Ich verwende C++ unter Visual Studio 2003 (7.1). Ich sehe keine Option, bei der ich beim Laden der Anwendung das Laden verzögert haben könnte. Ich habe nur Standardeinstellungen verwendet, als ich das DLL-Projekt erstellt habe. Ich habe gerade eine interessante Option gefunden, Linker-> Input-> Delay Loaded DLLs, also setze ich DWMAPI.DLL ein, um es zu verzögern. Allerdings bekomme ich dies beim Verknüpfen:

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

.. und es hat natürlich nichts geändert, wenn ich versuche, meine DLL zu laden. Für den Teufel davon, habe ich den ganzen Baum von DLLs hinzugefügt, die zu DWMAPI.DLL führen, und ich bekomme die gleiche Nachricht. (Für den Datensatz ist es foundation.dll-> shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll.)

Um genauer zu sein, was ich tue ich bin eine Maya-Plugin zu schreiben und den stets hilfreich Text im Script-Editor erhalten:

// 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) // 

I verwendet Dependency Walker, um zunächst das Problem aufzuspüren, und das ist, was mich führen zu dwmapi.dll. Dies sind die Botschaft richtet gibt mir und dwmapi.dll ist das einzige, was ein gelbes Fragezeichen daneben hat:

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. 

Gerald ist richtig. Maya verwendet tatsächlich einen anderen PATH als den Dependency Walker. Mein Plug-in lädt eine andere DLL (für die Bildverarbeitung), die im Verzeichnis der Maya-Plugins liegt, und hängt davon ab, dass es kein Problem gibt, Maya aber nicht. Ich musste "; Plug-Ins" zum PATH in Maya.env hinzufügen.

Nachdem dieses Problem nicht mit DWMAPI.DLL in Verbindung stand, DWMAPI jedoch ein häufiges Problem ist, werde ich den besten Link, den ich über das DWMAPI-Problem gefunden habe, auf der Novell-Website here veröffentlichen. Im Grunde haben die meisten Programme diese Warnung in der Datei depends.exe, aber wenn ein Symbol für die Verzögerung beim Laden daneben angezeigt wird und Sie sicher sind, dass das Programm DWMAPI nicht direkt oder indirekt aufruft, ist es in Ordnung. Das Problem ist woanders. Wenn das Verzögerungslade-Symbol nicht vorhanden ist, müssen Sie die Optionen/DELAY und/DELAYLOAD in Visual Studio anzeigen. Die Tatsache, dass das abhängt, gab mir eine "Warnung" und kein "Fehler" war ein Hinweis darauf, dass DWMAPI nicht automatisch geladen wird.

+1

Ich traf dieses Problem auf einem unserer Windows 2003 Server. Es ist nur eine blutige Konsolen-App und doch behauptet sie (oder eine andere Abhängigkeit), dass sie auch dwmapi.dll haben möchte. Ich würde gerne eine definitive Antwort darauf sehen. +1. – Kev

+0

Ich denke, viele der Ansichten stammen von Google Drive-bys. Nur die Suche nach "dwmapi.dll" hat dies als zweites Ergebnis. –

Antwort

7

Aufgrund Ihres aktualisierten Problems ist DWMAPI.dll wahrscheinlich nicht Ihr Problem. Dependency Walker gibt diesen Fehler immer dann, wenn Sie eine Verknüpfung zu mshtml herstellen, da er immer verzögert geladene DLLs überprüft.

An dieser Stelle ist meine beste Schätzung, dass Sie Ihr Projekt so eingestellt haben, dass die Laufzeitbibliotheken dynamisch geladen werden, und der Suchpfad für DLLs wird von Maya geändert. Daher ist es möglicherweise nicht möglich, die MSVC-Laufzeit-DLLs zu finden. Ich habe Maya-Plugins seit langer Zeit nicht mehr entwickelt, aber ich hatte dieses Problem mit anderen Apps, die in letzter Zeit Plugin-DLLs haben.

Versuchen Sie, Ihre Einstellung in C/C++ -> Codegenerierung -> Laufzeitbibliothek zu Multi-Threaded statt Multi-Threaded DLL zu ändern.

Abgesehen davon können Sie versuchen, mit Dependency Walker zu fummeln, damit es die gleichen Suchpfade wie Maya verwendet und Sie sehen, ob Sie ein weiteres Abhängigkeitsproblem haben.

Als letzten Ausweg können Sie Maya in einem Debugger starten und einen Haltepunkt auf LoadLibrary setzen und herausfinden, welche Bibliothek nicht auf diese Weise geladen wird.

+0

Nicht ein Nekromant auf dem Thread zu sein, nachdem ich gerade dieses Problem gelöst habe, wollte ich nur etwas hinzufügen. Wenn Sie feststellen, dass Ihre DLL statisch verknüpft ist (wie Gerald vorschlägt) und Sie dieses Problem immer noch haben, laden Sie Ihre DLL mit Visual Studio und überprüfen Sie deren Manifest. Wenn das Projekt von jemand anderem erstellt wurde, hat es möglicherweise eine .manifest-Datei enthalten, die in die Binärdatei ihre Abhängigkeiten einbettet, und das Betriebssystem wird ein Problem angeben, wenn es diese nicht finden kann, selbst wenn die DLL statisch verknüpft ist . Wenn Sie das Manifest finden, kommentieren und neu kompilieren, kann das Problem behoben werden. – Decker

3

Dies ist ein schwieriger. Es gibt wirklich 2 Wege, wie Sie diesen Fehler bekommen.

1) Sie haben Ihr Projekt so eingerichtet, dass verzögerungsgeladene DLLs beim Start der Anwendung geladen werden. DWMAPI.dll ist eine verzögerungsgeladene DLL und wird daher normalerweise nur geladen, wenn eine ihrer Funktionen aufgerufen wird. Unter XP passiert das nicht, es sei denn, Sie versuchen es in Ihrer DLL. Es ist jedoch möglich, eine Compileroption festzulegen, um zu erzwingen, dass Ihre Anwendung die verzögerungsgeladenen DLLs trotzdem lädt. Wenn du das tust, tu es nicht.

2) Es ist oft ein falscher Fehler, den Sie von depends.exe bekommen, wenn es ein anderes Problem gibt. Führen Sie Ihre DLL über den Dependency-Walker aus, und prüfen Sie, ob weitere Abhängigkeitsprobleme bestehen. Wenn alles andere fehlschlägt, versuchen Sie IE7 zu deinstallieren und sehen Sie, ob das Problem weiterhin besteht. Wenn es sich um einen falschen Fehler handelt, wird nach der Installation von IE7 der eigentliche Fehler angezeigt. Sie können IE7 danach erneut installieren.

3

Ich hatte genau dieses Problem.

Hinterhältiges Problem, das Stunden dauerte, um zu lösen.

Wie auch immer. Ich habe meine gemanagte C++ - Anwendung auf dem Release-Rechner kompiliert. Beschwerden von Kunden, die es nicht ausführen konnten, funktionierten wie ein Zauber auf all unseren Maschinen.

Es stellte sich heraus, dass der Release-Rechner vor einem Monat mit dem ATL-Schwachstellen-Fix automatisch eine Nacht gepatcht wurde, und so auch alle anderen Maschinen außer einem XP-Rechner.

Diese besondere XP-Maschine konnte die Anwendung auch nicht ausführen. Installierte den ATL-Fix (siehe Link unten), und voilá, alles funktionierte genauso wie zuvor.

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

So lernte Lektion, immer überprüfen Sie Ihre Zwischen Manifeste (die im Debug oder Release-Verzeichnis gefunden), die Ihnen sagen, welche Version der DLL, die das Programm gegen verknüpft wurden.

Ich hoffe, es hilft jedem.

2

Versuchen Sie, Ihre Einstellung in C/C++ -> Codegenerierung -> Laufzeitbibliothek zu Multi-Threaded statt Multi-Threaded DLL zu ändern.

+0

das hat für mich funktioniert - danke –

Verwandte Themen