web-dev-qa-db-fra.com

Comment réparer la dépendance de retard-charge DWMAPI.DLL sous WinXP?

J'ai créé un .dll sous WinXP qui prétend qu'il ne peut pas trouver DWMAPI.DLL lorsqu'il est chargé. Le problème est que ceci DLL est une DLL Vista, et c'est un problème connu pour les utilisateurs XP sur lesquels IE7 est installé. La recommandation est de désinstaller IE7 ou de réparer le .NET Framework via Ajout/Suppression de programmes. J'ai fait la réparation, et rien n'a changé. Je ne suis pas sur le point de désinstaller IE7 car il doit y avoir une meilleure solution qui n'est pas l'équivalent de "réinstaller Windows".

J'ai lu de mauvaises choses sur les personnes qui ont tenté de désinstaller IE7, donc je suis réticent à emprunter cette voie.

J'utilise C++ sous Visual Studio 2003 (7.1). Je ne vois pas d'option où j'ai peut-être forcé le chargement différé au lancement de l'application. J'ai juste utilisé les paramètres par défaut lorsque j'ai créé le projet DLL. Je viens de trouver une option intéressante, Linker-> Input-> DLL à chargement différé, donc j'ai mis DWMAPI.DLL là pour forcer à charger en différé. Cependant, j'obtiens ceci lors de la liaison:

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

.. et cela n'a bien sûr rien changé en essayant de charger ma DLL. Pour le plaisir, j'ai ajouté l'arborescence complète des DLL qui mènent à DWMAPI.DLL, et j'obtiens le même message. (Pour mémoire, il s'agit de foundation.dll-> Shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll.)

Pour être plus précis sur ce que je fais, j'écris un plugin Maya et j'obtiens le texte toujours utile dans l'éditeur de script:

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

J'ai utilisé Dependency Walker pour localiser initialement le problème, et c'est ce qui m'a conduit à DWMAPI.DLL. Ce sont le message qui me dépend, et DWMAPI.DLL est la seule chose qui a un point d'interrogation jaune à côté:

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 a raison. Maya utilise en fait un CHEMIN différent de celui du Dependency Walker. Mon plug-in en charge un autre DLL (pour le traitement des images) qui réside dans le répertoire des plug-ins Maya et en dépend sans problème, mais pas Maya. J'ai dû ajouter "; plug-ins "au PATH dans Maya.env.

Étant donné que ce problème n'était pas lié à DWMAPI.DLL après tout, mais DWMAPI est un problème courant, je publierai le meilleur lien que j'ai trouvé sur le problème DWMAPI sur le site Web de Novell ici . Fondamentalement, la plupart des programmes auront cet avertissement dans depend.exe, mais s'il y a une icône de chargement différé à côté et si vous êtes sûr que le programme n'appellera pas directement ou indirectement DWMAPI, alors ça va. Le problème est ailleurs. Si l'icône de chargement différé n'est pas présente, vous devez regarder les options/DELAY et/DELAYLOAD dans Visual Studio. Le fait que cela dépend m'a donné un "avertissement" et non une "erreur" était un indice du fait que DWMAPI n'est pas chargé automatiquement.

27
Jim Buck

En fonction de votre problème mis à jour, DWMAPI.dll n'est probablement pas votre problème. Le marcheur de dépendance vous donnera toujours cette erreur chaque fois que vous vous liez à mshtml car il vérifie toujours les DLL chargées avec retard.

À ce stade, ma meilleure supposition est que votre projet est configuré pour charger dynamiquement les bibliothèques d'exécution et le chemin de recherche des DLL est modifié par Maya. Il peut donc être impossible de trouver les DLL d'exécution MSVC. Je n'ai pas développé de plugins Maya depuis longtemps, mais j'ai eu ce problème avec d'autres applications qui ont récemment des DLL de plugins.

Essayez de modifier votre paramètre dans C/C++ -> Génération de code -> Bibliothèque d'exécution en DLL multithread plutôt que DLL multithread.

En plus de cela, vous pouvez essayer de jouer avec Dependency Walker pour lui faire utiliser les mêmes chemins de recherche que Maya et voir si vous pouvez trouver un autre problème de dépendance.

En dernier recours, vous pouvez lancer Maya dans un débogueur et définir un point d'arrêt sur LoadLibrary et découvrir quelle bibliothèque n'est pas chargée de cette façon.

7
Gerald

J'ai eu exactement ce problème.

Problème sournois qui a pris des heures à résoudre.

En tous cas. J'ai compilé mon application C++ managée sur la machine de publication. J'ai reçu des plaintes de clients qui ne pouvaient pas le faire fonctionner, fonctionnait comme un charme sur toutes nos machines.

Il s'est avéré que la machine de publication avait été corrigée automatiquement une nuit par mois avec le correctif de vulnérabilité ATL, tout comme toutes les autres machines, sauf une XP machine).

Cette particare XP n'a pas pu exécuter l'application non plus. Installé le correctif ATL (voir lien ci-dessous), et voilá, tout fonctionnait comme avant.

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

Donc, leçon apprise, vérifiez toujours vos manifestes intermédiaires (trouvés dans le répertoire de débogage ou de publication), qui vous diront à quelle version du DLL le programme a été lié).

J'espère que cela aide n'importe qui.

3
ROAR

Ceci est délicat. Il y a vraiment 2 façons principales d'obtenir cette erreur.

1) Votre projet est configuré pour forcer les DLL chargées avec retard à se charger au lancement de l'application. DWMAPI.dll est un DLL et donc normalement ne sera pas chargé à moins qu'une de ses fonctions ne soit appelée. Cela ne se produira pas sur XP sauf vous essayez de le faire dans votre DLL. Mais il est possible de définir une option de compilation pour forcer votre application à charger les DLL chargées en différé de toute façon. Si vous faites cela, ne le faites pas.

2) C'est souvent une fausse erreur que vous obtiendrez de depend.exe lorsqu'il y a un autre problème. Exécutez votre DLL via le guide de dépendance et voyez s'il y a d'autres problèmes de dépendance. Si tout le reste échoue, essayez de désinstaller IE7 et voyez si le problème persiste. S'il s'agit d'une fausse erreur, après avoir installé IE7 vous verrez l'erreur réelle. Vous pouvez réinstaller IE7 par la suite.

3
Gerald

Essayez de modifier votre paramètre dans C/C++ -> Génération de code -> Bibliothèque d'exécution en DLL multithread plutôt que DLL multithread.

2
user450279