CORRECTIF : Assert dans Appui1.cpp ligne 215 application MFC SDI/MDI

Traductions disponibles Traductions disponibles
Numéro d'article: 193102 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous tentez d'afficher une fenêtre modale sans spécifier explicitement un parent dans un gestionnaire de commandes d'une application MFC SDI/MDI, où la fenêtre frame est détruite dans le Gestionnaire de commandes avant d'afficher la fenêtre modale, vous pouvez obtenir une assertion dans CCmdTarget::GetRoutingFrame_() (ligne Appui1.cpp : 215) avec débogage génère.

Dans les versions release de l'application, les fenêtres modales peuvent se comporter de fenêtres similaires à non modale. Ce sera également le cas si vous mettez à jour une application MFC de Visual C++ 5.0 pour Visual C++ 6.0 (les deux versions de Visual C++ utilisent la DLL MFC nommé Mfc42.dll).

Cause

Les fenêtres modales utilisent maintenant le membre de données de trame routage (m_pRoutingFrame) de l'état du thread pour statuer sur le propriétaire du GetSafeOwner(). Le problème est que le CFrameWnd définie comme cadre de routage en cours de l'état du thread est supprimée, mais l'état du thread n'est pas mis à jour pour signaler cette situation.

Résolution

Image de routage en cours de l'état du thread la valeur NULL dans le destructeur de votre classe dérivée de CFrameWnd qui est en cours de destruction :

CMyFrameWnd::~CMyFrameWnd()
   {

      if( AfxGetThreadState()->m_pRoutingFrame == this )
      {
         AfxGetThreadState()->m_pRoutingFrame = NULL;
      }
   }
				

Statut

Microsoft a confirmé l'existence de ce bogue dans les produits Microsoft répertoriés au début de cet article. Ce bogue a été corrigé dans Visual Studio 6.0 Service Pack 1.

Pour obtenir ce service pack, consultez le site :
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx

Plus d'informations

Les fenêtres frames MFC concernés par ce problème peuvent être de type CFrameWnd, CMDIFrameWnd, CMDIChildWnd et COleIPFrameWnd.

Les fenêtres modales MFC affectés sont les suivantes :
  • Boîte de dialogue
  • CPropertySheet
  • Feuille de propriétés OLE [OleObject::DoVerb(OLEIVERB_PROPERTIES) appelée via [ASCII 150]]
  • COleBusyDialog
  • Boîte de message [appelée par le biais de AfxMessageBox()]
  • Fenêtre modale MAPI [lors de l'appel MAPISendMail()]
  • Boîte de dialogue de connexion de pilote de SQL [lors de l'appel SQLDriverConnect()]

Procédure pour reproduire le problème

  1. Utiliser AppWizard pour générer un exe MFC qui est une application MDI.
  2. Utilisez ClassWizard pour substituer OnCloseDocument de la classe CDocument générée par AppWizard.
  3. Modifiez la fonction membre OnCloseDocument comme illustré ici :
          void CMyDoc::OnCloseDocument()
          {
             CDocument::OnCloseDocument();
             AfxMessageBox("The Document is Closed");
          }
    					
  4. Générez et exécutez l'application.
  5. Dans le menu fichier, cliquez sur Fermer.
RESULTS : Le message d'erreur suivant s'affiche :
«Échec de l'assertion de débogage ! Ligne du fichier : Appui1.cpp : 215».
Pour corriger ce problème dans le cas mentionné ci-dessus, ajoutez le code suivant dans le destructeur de CChildFrame :

CChildFrame::~CChildFrame()
   {

      if( AfxGetThreadState()->m_pRoutingFrame == this )
      {
         AfxGetThreadState()->m_pRoutingFrame = NULL;
      }
   }
				


(c) 1998 Microsoft Corporation, tous droits réservés. Contributions par Brett Bentzinger, Microsoft

Références

Pour plus d'informations sur les service packs Visual Studio, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la base de connaissances Microsoft :
194022Visual Studio 6.0 service packs, quoi, où, pourquoi
194295Comment faire pour savoir qu'un service pack Visual Studio est installé
193009INFO : Fichier Readme de Visual Studio 6.0 Service Pack 1

Propriétés

Numéro d'article: 193102 - Dernière mise à jour: samedi 22 février 2014 - Version: 4.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbnosurvey kbarchive kbmt kbqfe kbbug kbdocview kbfix kbvc600sp1fix kbvs600sp1fix kbvs600sp2fix KB193102 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 193102
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com