Access violation in MFCO42D.DLL

Hello la zone,

Je fais du MFC en ce moment dans ma mission et je viens de tomber sur un bug poilu… J’ai une appli compilée en release qui fonctionne très bien, et compilée en debug elle plante au runtime sur l’ouverture d’une fenêtre de dialogue. J’ai un « access violation ». Du coup j’ai demandé au debugger de s’arrêter sur cette exception, et je vois que le code incriminé est en plein dans une DLL MFC :

[code]BOOL CHtmlView::GetTheaterMode() const
{
ASSERT(m_pBrowserApp != NULL);

VARIANT_BOOL result;
m_pBrowserApp->get_TheaterMode(&result);
return result;

}[/code]

Dans le fichier ViewHTML.cpp (c’est du MFC pur et dur). La violation a lieu sur la ligne get_TheatreMode, et apparemment c’est un problème qui est propre à la DLL de debug MFCO42D.DLL (c’est à dire un problème qui n’apparaît qu’en debug).

Jusque là… Tout va mal mais je comprends. Maintenant mon problème c’est que cette DLL je ne l’ai tout simplement pas dans C:\Windows\System32 sur cette machine là, alors que sur un autre poste de dév elle y est bien. J’ai bien installé Visual Studio 6 (SP5). Et j’ai l’impression que cette DLL a été renommée (ou a disparu… refondue dans une autre), car elle ne fait pas partie de la version redistribuable de Visual C++ 6 (telle que vue sur le support Microsoft & sur le CD d’install de Visual).

Et là c’est donc « need help ». Avez-vous une idée d’où peut venir cette DLL ? Pourquoi sur l’autre poste de dév elle existe ? Ou comment la contourner ?

Merci d’avance pour toute aide vu le degré de chiantitude du sujet.

Bon en même temps ils en veulent de faire tourner du Visual C++ 6 sur un Windows XP 64 bits virtualisé…

Bon. Auto-réponse (et pour la postérité) : mettre le contenu du répertoire VC98/DEBUG du CD dans le répertoire VC98 d’install. Ajouter VC98/DEBUG dans le path. Même une install full depuis le CD ne rajoute pas ces fichiers là… il faut le faire à la main et ça n’est indiqué à aucun endroit. Merci Microsoft :frowning:

Si link statique le dependency walker est ton ami (http://www.dependencywalker.com/)… Sinon process xp (http://technet.microsoft.com/fr-fr/sysinternals/bb896653) pour lister les modules chargés au runtime… Il te donnera normalement le chemin de la dll chargée.

C’est du dynamique. J’ai lancé dependency walker sans succès avant de trouver via un simple Ctrl+F sur le CD visual…

Pour process explorer (on parle bien du tool de sysinternals ?) je n’ai pas trop compris comment voir la DLL chargée dynamiquement. En fait j’ai demandé à Visual en mode debug de m’arrêter sur toutes les exceptions de type “Access violation” et j’ai regardé quelle DLL il essayait de loader juste avant l’appel c’est comme ça que j’ai eu le nom de la DLL.

sous process XP tu sélectionnes dans la liste le process et tu appuies sur ctrl+d. La liste des dll utilisées/chargées par le process s’affichera alors. En passant le curseur sur la dll, tu auras le chemin de la dll.

Merci pour l’astuce, j’en aurai sûrement besoin un jour :wink:

Pour info, pour les curieux, toute cette m*rde était due à un ActiveX inséré il y a très longtemps par un développeur pas très inspiré, et qui du coup créait une dépendance entre notre application et MS Office… Résultat, quand on a livré notre GUI sur une nouvelle machine pour faire du Citrix, sans Office, kaboum !

Y a des jours comme ça…

Je compatis… J’ai connu le même genre d’emmerde avec une appli qui nécessitait absolument qu’une certaine version d’office soit installée pour marcher… Super notamment lorsque le soft en question ne se trouvait déjà plus que chez les broker…

D’ailleurs ça me fait penser qu’on va certainement retomber sur le même problème vu que l’on prévoyait de réutiliser une partie de ce soft pour le projet sur lequel je suis… fail… :pinch: