CORRECTIF : La fonction CDialog::Create() renvoie une valeur incorrecte lors de la création d'une boîte de dialogue dans Visual C++

Traductions disponibles Traductions disponibles
Numéro d'article: 193099 - 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

Si une boîte de dialogue est créée via l'appel CDialog::Create() et OnInitDialog() (en réponse au message WM_INITDIALOG) extrémités de la boîte de dialogue de la boîte de dialogue via EndDialog(), la fonction CDialog::Create() renvoie une valeur différente de zéro. Dans ce cas, le CDialog::Create() doit retourner zéro.

Étant donné que la boîte de dialogue a été détruite suite à un appel EndDialog() dans OnInitDialog() la boîte de dialogue, CDialog::m_hWnd est NULL dans ce cas.

Cause

Un test supplémentaire a été effectué dans le code WM_INITDIALOG (au niveau de ligne 365 de dlgcore.cpp), ce qui conduit à Create() réussir, même si le handle de fenêtre est NULL.

Code MFC pour Visual C++ 5.0 :
BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,

      CWnd* pParentWnd, HINSTANCE hInst)

   {

      // ...

      if (hWnd == NULL)
      {
         // ...
         // .. dump some debug information
         return FALSE;
      }

      ASSERT(hWnd == m_hWnd);
      return TRUE;
   }
				
Code MFC pour Visual C++ 6.0 :
BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,

      CWnd* pParentWnd, HINSTANCE hInst)

   {

      // ...
      // Help with error diagnosis (only if WM_INITDIALOG didn't
      // EndDialog())
      if (hWnd == NULL && (m_nFlags &amp; WF_CONTINUEMODAL)) // <--- PROBLEM!!!

{
         // ... dump some debug information.
         return FALSE;
      }

      ASSERT(hWnd == m_hWnd);
      return TRUE;

   }
				

Résolution

Vérifiez lorsque CDialog::Create l'appel à la fois la valeur de retour de CDialog::Create() et la valeur de CDialog::m_hWnd. Si CDialog::m_hWnd est NULL, la création de la boîte de dialogue est infructueuse.

Statut

Microsoft a confirmé l'existence de ce bogue dans le Microsoft produits 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
Pour plus d'informations sur Visual Studio 6.0 Service Pack 1, consultez les articles suivants dans la base de connaissances Microsoft :
193009 INFO: Visual Studio 6.0 Service Pack 1 Readme

194022 Visual Studio 6.0 service packs, what, where, why

194295 How To Tell That a Visual Studio Service Pack Is Installed

Plus d'informations

Modifier le code pour afficher la boîte de dialogue afin qu'il vérifie également par rapport à la variable CDialog::m_hWnd. Par exemple :
 
   // Create a modeless dialog box. In this example, m_pModeless is a
   // member variable of type CModeless where CModeless is a CDialog-
   // derived class. IDD_MODELESS is the ID number of a dialog-box template
   // resource.
   m_pModeless = new CModeless;
   if (m_pModeless->Create(IDD_MODELESS, this) &&
      ::IsWindow(m_pModeless->m_hWnd))
   {
      // ... succeeded in dialog-box creation.
   }
   else
   {
      // ... failed in dialog-box creation.
   }
				

Procédure pour reproduire le problème

  1. Copie de l'exemple MFC MODELESS à partir des CD-ROM de MSDN.
  2. ClassWizard permet d'ajouter un gestionnaire de messages OnInitDialog() (en réponse au message WM_INITDIALOG) à la classe CAdderDialog. CAdderDialog est une classe dérivée de CDialog.
  3. Appelez EndDialog() dans le CAdderDialog::OnInitDialog() comme suit :
       BOOL CAdderDialog::OnInitDialog()
       {
          CDialog::OnInitDialog();
    
          // TODO: Add extra initialization here
          EndDialog(-1);
          return TRUE;  // return TRUE unless you set the focus to a control
                   // EXCEPTION: OCX Property Pages should return FALSE
       }
    					
  4. Sélectionnez génération Win32 Release dans VC ++ de commande de menu Build\Set Active Configuration.
  5. Générer et exécuter l'exemple MODELESS.
  6. Cliquez sur Ajouter dans la boîte de dialogue. L'appel m_pModeless->Create() dans le fichier Modeldlg.cpp (, ligne 178) renvoie TRUE, dans ce cas à l'origine du bouton Ajouter (pour afficher la boîte de dialogue non modale CAdderDialog) soit désactivée.
(c) 1999 Microsoft Corporation, tous droits réservés. Contribution de Yeong-Kah TAM, Microsoft Corporation.

Propriétés

Numéro d'article: 193099 - Dernière mise à jour: samedi 22 février 2014 - Version: 6.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++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Initiation
    • 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 kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 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: 193099
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