Oprava: CDialog::Create() funkce vrací nesprávnou hodnotu při dialogové okno je vytvořena v jazyce C++

Překlady článku Překlady článku
ID článku: 193099 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Pokud dialogové okno je vytvořena prostřednictvím volání CDialog::Create() a dialogové okno OnInitDialog() (v odpovědi na zprávu WM_INITDIALOG) zakončení dialogovém prostřednictvím EndDialog(), vrátí funkce CDialog::Create() nenulovou hodnotu. CDialog::Create() v tomto případě by se měl vrátit nula.

Protože dialogové okno byl z důvodu zničena EndDialog() volání v dialogovém okně OnInitDialog(), CDialog::m_hWnd v tomto případě je NULL.

Příčina

Další testovací byla provedena v WM_INITDIALOG kód (na řádku 365 Dlgcore.cpp) který vede k úspěšné Create(), i když popisovač okna je NULL.

Kód MFC 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;
   }
				
Kód MFC 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;

   }
				

Řešení

Volání CDialog::Create se zkontrolovat při vrácená hodnota CDialog::Create() a hodnotu CDialog::m_hWnd. Pokud CDialog::m_hWnd je NULL, je dialogové okno vytvoření neúspěšné.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná být chybou v Microsoft produkty uvedené na začátku tohoto článku. Tuto chybu byl vyřešen v Visual Studio 6.0 Service Pack 1.

Chcete-li získat tuto aktualizaci service pack, naleznete v tématu:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
Další informace o Visual Studio 6.0 Service Pack 1 naleznete v následujících článcích znalostní báze 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

Další informace

Upravte kód pro zobrazení dialogového okna, takže kontroluje také proti proměnné CDialog::m_hWnd. Pro instanci:
 
   // 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.
   }
				

Kroky pro reprodukci chování

  1. Zkopírujte ukázkové MFC NEMODÁLNÍ z disků CD-ROM MSDN.
  2. Přidejte obslužnou rutinu OnInitDialog() zprávy (v odpovědi na zprávu WM_INITDIALOG) třídy CAdderDialog pomocí ClassWizard. CAdderDialog je CDialog odvozené třídy.
  3. Volání EndDialog() způsobem v CAdderDialog::OnInitDialog():
       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. Vyberte verzi Win32 sestavení z VC ++ jeho konfiguraci Active Build\Set příkaz nabídky.
  5. Sestavit a spustit ukázkový NEMODÁLNÍ.
  6. Klepněte na tlačítko Přidat v dialogovém okně. Volání m_pModeless->Create() v souboru Modeldlg.cpp (na řádku 178) vrátí hodnotu TRUE v tomto případě příčinou tlačítko Přidat (pro zobrazení CAdderDialog nemodální dialogového okna) být zakázána.
(c) 1999 Microsoft Corporation, všechny rezervované práv. Příspěvky podle Yeong Kah Tam, společnost

Vlastnosti

ID článku: 193099 - Poslední aktualizace: 1. března 2014 - Revize: 6.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Foundation Class Library 4.2 na těchto platformách
    • 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
Klíčová slova: 
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:193099

Dejte nám zpětnou vazbu

 

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