Update: Wenn ein Dialogfeld in Visual C++ erstellt wird, gibt die CDialog::Create()-Funktion einen falschen Wert

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 193099 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn ein Dialogfeld über dem Aufruf von CDialog::Create() und das Dialogfeld OnInitDialog() (Reaktion auf WM_INITDIALOG Nachricht) beendet das Dialogfeld über EndDialog() erstellt wird, gibt die CDialog::Create()-Funktion einen Wert ungleich 0 (null) zurück. Die CDialog::Create() sollte in diesem Fall 0 (null) zurück.

Da das Dialogfeld zu einem Aufruf EndDialog() in das Dialogfeld OnInitDialog() aufgrund zerstört wurde, ist CDialog::m_hWnd in diesem Fall NULL.

Ursache

Ein zusätzlicher Test wurde der Code WM_INITDIALOG (in Zeile 365 der dlgcore.cpp) vorgenommen, die zu Create() Erfolg, führt auch wenn das Fensterhandle NULL ist.

MFC-Code für 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;
   }
				
MFC-Code für 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;

   }
				

Lösung

Beim Aufrufen von CDialog::Create sowohl den Rückgabewert der CDialog::Create() und der Wert der CDialog::m_hWnd überprüfen. Wenn CDialog::m_hWnd NULL ist, ist die Erstellung im Dialogfeld nicht erfolgreich.

Status

Microsoft hat bestätigt, dass es sich dabei um einen Fehler in den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind. Dieser Bug wurde in Visual Studio 6.0 Service Pack 1 behoben.

Dieses Servicepack erhalten, finden:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
Weitere Informationen zu Visual Studio 6.0 Service Pack 1 finden Sie in die folgenden Artikeln der Microsoft Knowledge Base:
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

Weitere Informationen

Ändern Sie den Code für die Anzeige des Dialogfeldes so außerdem gegen die Variable CDialog::m_hWnd prüft. Zum Beispiel:
 
   // 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.
   }
				

Schritte zum Reproduzieren des Verhaltens

  1. Kopieren Sie MFC-Beispiel UNGEBUNDEN aus der MSDN-CD.
  2. Verwenden Sie Klassen-Assistenten, um einen Meldungshandler OnInitDialog() (Reaktion auf WM_INITDIALOG Nachricht) der CAdderDialog-Klasse hinzuzufügen. CAdderDialog ist eine CDialog abgeleiteten Klasse.
  3. Rufen Sie EndDialog() in der CAdderDialog::OnInitDialog() wie folgt:
       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. VC Win32 Release-Build auswählen ++ des Build\Set Active Configuration Menübefehl.
  5. Erstellen Sie und führen Sie das MODELESS-Beispiel.
  6. Klicken Sie auf Hinzufügen im Dialogfeld. Gibt der Aufruf m_pModeless->Create() in Modeldlg.cpp-Datei (in Zeile 178) WAHR zurück, in diesem Fall verursachen die Schaltfläche hinzufügen (für das nicht modale Dialogfeld CAdderDialog anzuzeigen), deaktiviert werden.
(c) 1999 Microsoft Corporation, alle Rechte vorbehalten. Beiträge von Yeong Kah TAM, Microsoft Corporation.

Eigenschaften

Artikel-ID: 193099 - Geändert am: Samstag, 22. Februar 2014 - Version: 6.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Foundation Class Library 4.2, wenn verwendet mit:
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Keywords: 
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 193099
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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