CORRECÇÃO: A função CDialog::Create() retorna um valor incorreto quando uma caixa de diálogo é criada no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 193099 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Se uma caixa de diálogo for criada por meio de chamada CDialog::Create() e OnInitDialog() (em resposta a mensagem WM_INITDIALOG) termina da caixa de diálogo a caixa de diálogo via EndDialog(), a função CDialog::Create() retorna um valor diferente de zero. Nesse caso o CDialog::Create() deve retornar zero.

Porque a caixa de diálogo foi destruída devido para uma chamada de EndDialog() no OnInitDialog() da caixa de diálogo, o CDialog::m_hWnd nesse caso é NULL.

Causa

Um teste adicional foi feito no código WM_INITDIALOG (na linha 365 de Dlgcore.cpp), que leva a Create() subseqüente mesmo se o identificador de janela for NULL.

Código do 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;

   }
				

Resolução

Quando chamar CDialog::Create Verifique o valor de retorno de CDialog::Create() e o valor de CDialog::m_hWnd. Se CDialog::m_hWnd for NULL, a criação de caixa de diálogo é sem êxito.

Situação

Microsoft confirmou que este seja um bug no Microsoft produtos listados no começo deste artigo. Esse bug foi corrigido no Visual Studio 6.0 Service Pack 1.

Para obter este service pack, consulte:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
Para obter mais informações sobre o Visual Studio 6.0 Service Pack 1, consulte os seguintes artigos na Base de dados de Conhecimento da 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

Mais Informações

Modificar o código para exibir a caixa de diálogo para que ele também verifica contra a variável CDialog::m_hWnd. Por exemplo:
 
   // 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.
   }
				

Etapas para reproduzir o problema

  1. Copie o exemplo MFC sem janela RESTRITA de CDs do MSDN.
  2. Use ClassWizard para adicionar um manipulador de mensagem OnInitDialog() (em resposta a mensagem WM_INITDIALOG) para a classe CAdderDialog. CAdderDialog é uma classe derivada de CDialog.
  3. Chamar EndDialog() in a CAdderDialog::OnInitDialog() da seguinte maneira:
       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. Selecionar criar versão Win32 do VC ++ do comando de menu Build\Set Active Configuration.
  5. Criar e executar o exemplo sem janela RESTRITA.
  6. Clique em Adicionar na caixa de diálogo. A chamada m_pModeless->Create() no arquivo Modeldlg.cpp (na linha 178) retorna TRUE, nesse caso fazendo com que o botão Adicionar (para exibir a caixa de diálogo sem janela restrita CAdderDialog) a ser desativado.
(c) 1999 Microsoft Corporation, todos os direitos reservados. Contribuições de Yeong Kah TAM, Microsoft Corporation.

Propriedades

ID do artigo: 193099 - Última revisão: sábado, 22 de fevereiro de 2014 - Revisão: 6.2
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • 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
Palavras-chave: 
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 193099

Submeter comentários

 

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