Question

J'ai construit un fichier .dll sous WinXP qui déclare ne pas pouvoir trouver DWMAPI.DLL lorsqu’il est chargé. Le problème est que cette DLL est une DLL Vista et qu'il s'agit d'un problème connu des utilisateurs de XP sur lequel 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 ne soit pas l'équivalent de "réinstaller Windows".

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

J'utilise C ++ sous Visual Studio 2003 (7.1). Je ne vois pas d’option où je pourrais avoir forcé le chargement différé au lancement de l’application. Je viens d'utiliser les paramètres par défaut lorsque j'ai créé le projet DLL. Je venais tout juste de trouver une option intéressante, DLL Linker- > Input- > Delay Loaded. J'ai donc inséré DWMAPI.DLL dans cette liste pour le forcer à être chargé avec un retard. Cependant, je reçois 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é toute l'arborescence des DLL qui mènent à DWMAPI.DLL et je reçois le même message. (Pour mémoire, il s'agit de foundation.dll - > shell32.dll- > shdocvw.dll- > mshtml.dll- & ie; ieframe.dll- > dwmapi.dll.)

Pour être plus précis sur ce que je fais, j'écris un plugin Maya et je reçois 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 d'abord utilisé Dependency Walker pour détecter le problème, et c'est ce qui m'a conduit à DWMAPI.DLL. Voici le message que cela dépend de moi, et DWMAPI.DLL est la seule chose qui comporte un point d'interrogation jaune:

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.

Gérald a raison. Maya utilise en fait un PATH différent du Dependency Walker. Mon plug-in charge une autre DLL (pour le traitement de l'image) qui se trouve dans le répertoire des plug-ins Maya et dépend sans problème, mais Maya ne l'a pas fait. Je devais ajouter des "plug-ins". au PATH dans Maya.env.

Étant donné que ce problème n'était pas lié à DWMAPI.DLL après tout, mais que DWMAPI est un problème courant, je vais publier le meilleur lien que j'ai trouvé sur le problème DWMAPI sur le site Web de Novell ici . Cet avertissement est généralement associé à la plupart des programmes, mais s'il y a une icône de délai de chargement et que vous êtes certain que le programme n'appellera pas directement ou indirectement DWMAPI, alors tout va bien. Le problème est ailleurs. Si l'icône de chargement différé n'est pas présente, vous devez alors examiner les options / DELAY et / DELAYLOAD dans Visual Studio. Le fait que cela dépende m'a donné un "avertissement". et non une " erreur " était un indice sur le fait que DWMAPI n'est pas chargé automatiquement.

Était-ce utile?

La solution

Selon votre problème mis à jour, DWMAPI.dll n'est probablement pas votre problème. Le gestionnaire de dépendances vous indiquera toujours cette erreur chaque fois que vous établissez un lien vers mshtml, car il vérifie toujours les DLL chargées avec du retard.

À ce stade, ma meilleure hypothèse est que votre projet est configuré pour charger dynamiquement les bibliothèques d'exécution et que le chemin de recherche des DLL est modifié par Maya. Il est donc peut-être impossible de trouver la ou 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 des DLL de plugins récemment.

Essayez de modifier vos paramètres dans C / C ++ - > Génération du code- > Bibliothèque d'exécution à des DLL à plusieurs threads plutôt qu'à des DLL à plusieurs threads.

En dehors 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 poser 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 afin de déterminer quelle bibliothèque n'est pas chargée de cette façon.

Autres conseils

Ceci est une question délicate. Vous obtiendrez cette erreur de deux manières principales.

1) Votre projet est configuré pour forcer le chargement des DLL chargées avec un retard lors du lancement de l'application. DWMAPI.dll est une DLL à retardement, elle ne sera donc chargée normalement que si une de ses fonctions est appelée. Cela ne se produira pas sur XP à moins d’essayer de le faire dans votre DLL. Mais il est possible de définir une option de compilateur pour forcer votre application à charger les DLL chargées avec retard. 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 programme de recherche de dépendances et voyez s’il existe d’autres problèmes de dépendance. Si tout échoue, essayez de désinstaller IE7 et voyez si le problème persiste. S'il s'agit d'une erreur fausse, après avoir installé IE7, vous verrez la véritable erreur. Vous pouvez réinstaller IE7 par la suite.

J'ai eu exactement ce problème.

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

Quoi qu'il en soit. J'ai compilé mon application C ++ gérée sur la machine de publication. Nous avons eu des plaintes de clients qui n’ont pas pu le faire fonctionner et qui ont fonctionné comme un charme sur toutes nos machines.

Il s’est avéré que le correctif de vulnérabilité ATL était automatiquement corrigé la nuit après la mise à jour de la machine de publication, il en était de même pour toutes les autres machines, à l’exception d’une machine XP.

Cette machine XP particulière ne pouvait pas non plus exécuter l’application. Installation du correctif ATL (voir lien ci-dessous) et de voil & # 225 ;, tout a fonctionné comme avant.

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

Pour tirer les leçons, vérifiez toujours vos manifestes intermédiaires (dans le répertoire de débogage ou de publication), qui vous indiqueront la version de la DLL à laquelle le programme a été lié.

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

Essayez de modifier vos paramètres dans C / C ++ - > Génération du code- > Bibliothèque d'exécution à des DLL à plusieurs threads plutôt qu'à des DLL à plusieurs threads.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top