FIX: 的 CDialog::Create() 函式傳回一個不正確值在 Visual C++ 中建立一個對話方塊時

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

193099
本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
如果一個對話方塊會建立透過 CDialog::Create()] 呼叫和對話方塊的 (以 WM_INITDIALOG 訊息回應) OnInitDialog() 結束對話方塊透過 EndDialog(),CDialog::Create() 函數會傳回非零值。[CDialog::Create() 在這種情況下應傳回零。

因為對話方塊終結由於,EndDialog() 呼叫中] 對話方塊的 OnInitDialog(),CDialog::m_hWnd 就會在這種情況下是 NULL。
發生的原因
在通往 Create() 後續即使視窗控制碼是 NULL,WM_INITDIALOG 程式碼 (在一行 365 Dlgcore.cpp),進行額外的測試。

Visual C++ 5.0 的 MFC 程式碼:
BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,      CWnd* pParentWnd, HINSTANCE hInst)   {      // ...      if (hWnd == NULL)      {         // ...         // .. dump some debug information         return FALSE;      }      ASSERT(hWnd == m_hWnd);      return TRUE;   }				
Visual C++ 6.0 的 MFC 程式碼:
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;   }				
解決方案
當呼叫 CDialog::Create 同時選取之傳回值的 CDialog::Create() 及 CDialog::m_hWnd 的值。如果 CDialog::m_hWnd NULL 對話方塊建立是不成功。
狀況說明
Microsoft 已確認這是在 Microsoft 中的有錯誤的本文開頭所列出的產品。這個 Bug 已修正在 Visual Studio 6.0 服務封包 1。

若要取得這個 Service Pack,請參閱:如需有關 Visual Studio 6.0 Service Pack 1 的詳細資訊,請參閱下列文件 「 Microsoft 知識庫 」 中:
其他相關資訊
修改顯示該對話方塊,因此它也會檢查對 CDialog::m_hWnd 變數的程式碼。舉個例說:
    // 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.   }				

重製行為的步驟

  1. 從 MSDN CD 複製 MFC 範例 MODELESS。
  2. 使用 ClassWizard 將 (以回應 WM_INITDIALOG 訊息) 的 OnInitDialog() 訊息處理常式加入至 CAdderDialog 類別。CAdderDialog 是 CDialog 衍生的類別。
  3. 在 [CAdderDialog::OnInitDialog() 中,如下所示呼叫 EndDialog():
       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. Win32 發行組建可供選 VC + + 的 Build\Set 現用組態] 功能表命令。
  5. 建置並執行非強制回應 (Modeless) 的範例。
  6. 按一下 [[] 對話方塊中的 [新增]。Modeldlg.cpp 檔案 (在行 178) 中的 m_pModeless->Create() 呼叫會傳回在這種情況下造成 (顯示 CAdderDialog 非強制回應 (Modeless) 對話方塊) 的 [新增] 按鈕的 TRUE 停用。
(c) Microsoft Corporation 1999,保留所有的權限。 由 Yeong Kah Tam,Microsoft Corporation 的貢獻。

警告:本文已自動翻譯

內容

文章識別碼:193099 - 最後檢閱時間:02/23/2014 05:24:54 - 修訂: 6.2

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtzh
意見反應