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

文章翻譯 文章翻譯
文章編號: 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,請參閱:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
如需有關 Visual Studio 6.0 Service Pack 1 的詳細資訊,請參閱下列文件 「 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

其他相關資訊

修改顯示該對話方塊,因此它也會檢查對 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 - 上次校閱: 2014年2月23日 - 版次: 6.2
這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • 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
關鍵字:?
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:193099
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

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