FIX: CDialog::Create() 函数返回了不正确的值在 Visual c + + 中创建一个对话框时,

文章翻译 文章翻译
文章编号: 193099 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

症状

如果通过 CDialog::Create() 呼叫和 $ 对话框 (在响应 WM_INITDIALOG 消息) 的 OnInitDialog() 结束 EndDialog() 通过对话框创建一个对话框,,CDialog::Create() 函数返回非零值。在这种情况下该 CDialog::Create() 应返回零。

因为对话框已被销毁由于 EndDialog() 调用在对话框的 OnInitDialog(),CDialog::m_hWnd 在这种情况下为空。

原因

(在行 365 的 Dlgcore.cpp),从而导致 Create() 成功即使窗口句柄为 NULL WM_INITDIALOG 代码中进行了其他的测试。

对于 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 中的错误在本文开头列出的产品。在 Visual Studio 6.0 Service Pack 1 中,已修复此 bug。

若要获取此服务包,请参阅:
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 示例无模式。
  2. 类向导用于向 CAdderDialog 类添加 OnInitDialog() 消息处理程序 (在响应 WM_INITDIALOG 消息)。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. 生成,然后运行 $ 无模式的示例。
  6. 单击对话框中的添加。m_pModeless->Create() 呼叫 Modeldlg.cpp 文件 (位于行 178) 中的,返回真,在这种情况下导致显示 CAdderDialog 无模式对话框) 的添加按钮被禁用。
(c) Microsoft Corporation 1999,保留的所有权限。 由 Yeong Kah 团队,Microsoft 公司的贡献。

属性

文章编号: 193099 - 最后修改: 2014年2月22日 - 修订: 6.2
这篇文章中的信息适用于:
  • Microsoft Foundation Class Library 4.2?当用于
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 5.0 学习版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
关键字:?
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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