ИСПРАВЛЕНИЕ: Функция CDialog::Create() возвращает неправильное значение, при создании диалогового окна в Visual C++

Переводы статьи Переводы статьи
Код статьи: 193099 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Развернуть все | Свернуть все

В этой статье

Проблема

Если создается диалоговое окно с помощью вызова CDialog::Create() и заканчивается OnInitDialog() (в ответ на сообщение WM_INITDIALOG) из диалогового окна функция CDialog::Create() возвращает диалоговом окне через EndDialog() ненулевое значение. В этом случае CDialog::Create() должен возвращать нулевое значение.

Поскольку диалоговое окно был уничтожен из-за на вызов EndDialog() в диалоговое окно OnInitDialog() CDialog::m_hWnd имеет значение NULL в данном случае.

Причина

Дополнительные тестовые была произведена в коде WM_INITDIALOG (на Строка 365 Dlgcore.cpp), что приводит к Create() последующий даже если окно дескриптор равен NULL.

Код 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;
   }
				
Код 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;

   }
				

Решение

При вызове CDialog::Create проверять как возвращаемое значение CDialog::Create(), а значение CDialog::m_hWnd. Если CDialog::m_hWnd Значение NULL, а затем -диалоговое окно создания завершается неудачно.

Статус

Корпорация Майкрософт подтверждает это будет ошибкой в корпорации Майкрософт продукты, перечисленные в начале этой статьи. Эта ошибка будет исправлена в Visual Studio 6.0 пакета обновления 1.

Чтобы получить этот пакет обновления обратитесь к:
http://msdn2.Microsoft.com/en-US/Vstudio/Aa718362.aspx
Дополнительные сведения о Visual Studio 6.0 пакетом обновления 1 обратитесь к следующим статьям Microsoft Knowledge Base:

Дополнительная информация

Изменение кода для отображения диалогового окна, поэтому он также Проверка переменной 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. Копирование образца MFC НЕМОДАЛЬНЫХ с компакт-дисков MSDN.
  2. Используйте ClassWizard для добавления обработчика сообщений OnInitDialog() (в ответ на сообщение WM_INITDIALOG) для класса CAdderDialog. CAdderDialog представляет собой класс, производный от класса CDialog.
  3. Вызов EndDialog() в 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. Выберите Win32 выпускное построение VC ++ активного Build\Set Команда меню конфигурации.
  5. Постройте и запустите Образец MODELESS.
  6. Нажмите кнопку Добавить в диалоговом окне. M_pModeless->Create() вызов в файле Modeldlg.cpp (строка 178) возвращает значение TRUE, при этом вызывает Кнопка «Добавить» (для отображения безрежимного диалогового окна CAdderDialog) быть отключено.
(c) Корпорация Майкрософт 1999 г. все права защищены. Отчисления по Yeong-Kah Технический консультант, корпорация Майкрософт.

Свойства

Код статьи: 193099 - Последний отзыв: 23 февраля 2014 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Foundation Class Library 4.2 на следующих платформах
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
Ключевые слова: 
kbnosurvey kbarchive kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix kbmt KB193099 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:193099

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