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

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.

193099
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
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: 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:
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

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 193099 - Poslední kontrola: 03/01/2014 05:47:11 - Revize: 6.2

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtcs
Váš názor