REVISIÓN: La función CDialog::Create() devuelve un valor incorrecto cuando se crea un cuadro de diálogo en Visual C++

Seleccione idioma Seleccione idioma
Id. de artículo: 193099 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Si un cuadro de diálogo se crea mediante la llamada CDialog::Create() y OnInitDialog() (en respuesta al mensaje WM_INITDIALOG) termina del cuadro de diálogo el cuadro de diálogo a través de EndDialog(), la función CDialog::Create() devuelve un valor distinto de cero. En este caso el CDialog::Create() debe devolver cero.

Ya se ha destruido el cuadro de diálogo debido a una llamada EndDialog() en OnInitDialog() del cuadro de diálogo, CDialog::m_hWnd en este caso es NULL.

Causa

Se realizó una prueba adicional en el código WM_INITDIALOG (en línea 365 de dlgcore.cpp), que conduce a Create() éxito incluso si el identificador de ventana es NULL.

Código MFC para 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;
   }
				
Código MFC para 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;

   }
				

Solución

Cuando la llamada CDialog::Create Compruebe el valor devuelto de CDialog::Create() y el valor de CDialog::m_hWnd. Si CDialog::m_hWnd es NULL, la creación de cuadro de diálogo es incorrecta.

Estado

Microsoft ha confirmado que se trata de un error de los productos Microsoft enumerados al principio de este artículo. Este error se ha solucionado en Visual Studio 6.0 Service Pack 1.

Para obtener este service pack, consulte:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
Para obtener más información en Visual Studio 6.0 Service Pack 1, vea los artículos siguientes en Microsoft Knowledge Base:
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

Más información

Modifique el código para mostrar el cuadro de diálogo, por lo que también se comprueba con respecto a la variable CDialog::m_hWnd. Por ejemplo:
 
   // 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.
   }
				

Pasos para reproducir este comportamiento

  1. Copie el ejemplo de MFC MODELESS desde los CDs de MSDN.
  2. Utilice ClassWizard para agregar un controlador de mensajes OnInitDialog() (en respuesta al mensaje WM_INITDIALOG) a la clase CAdderDialog. CAdderDialog es una clase derivada de CDialog.
  3. Llame al EndDialog() en el CAdderDialog::OnInitDialog(), como sigue:
       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. Seleccione lanzamiento Win32 de VC ++ del comando de menú Build\Set configuración activa.
  5. Genere y ejecute el ejemplo MODELESS.
  6. Haga clic en Agregar en el cuadro de diálogo. La llamada m_pModeless->Create() en el archivo de Modeldlg.cpp (en la línea 178) devuelve TRUE, causando en este caso el botón Agregar (para mostrar el cuadro de diálogo no modal CAdderDialog) que se va a deshabilitar.
(c) Microsoft Corporation 1999, Reservados todos los derechos. Contribuciones por Yeong Kah TAM, Microsoft Corporation.

Propiedades

Id. de artículo: 193099 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 6.2
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palabras clave: 
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 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