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

Traduções de Artigos Traduções de Artigos
Artigo: 193099 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Se uma caixa de diálogo é criada através da chamada CDialog::Create() e OnInitDialog() (em resposta à mensagem WM_INITDIALOG) termina a caixa de diálogo a caixa de diálogo através de EndDialog(), a função CDialog::Create() devolve um valor diferente de zero. Neste caso, o CDialog::Create() deverá devolver zero.

Uma vez que a caixa de diálogo foi destruída devido a uma chamada EndDialog() na OnInitDialog() caixa de diálogo, CDialog::m_hWnd é NULL neste caso.

Causa

Foi efectuado um teste adicional no código WM_INITDIALOG (linha 365 de Dlgcore.cpp), que conduz a Create() ter êxito mesmo se o identificador de janela for NULL.

MFC código de 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 de 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 devolvido da CDialog::Create() e o valor de CDialog::m_hWnd. Se CDialog::m_hWnd for NULL, a criação da caixa de diálogo não tiver êxito.

Ponto Da Situação

Microsoft confirmou que este seja um erro no Microsoft produtos listados no início deste artigo. Este erro 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ção

Modifique o código para apresentar a caixa de diálogo para 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.
   }
				

Passos para reproduzir o comportamento

  1. Copie o exemplo MFC não MODAIS dos CDs da MSDN.
  2. Utilize ClassWizard para adicionar um processador de mensagens OnInitDialog() (em resposta à mensagem WM_INITDIALOG) para a classe CAdderDialog. CAdderDialog é uma classe derivada de CDialog.
  3. Chamar EndDialog() o CAdderDialog::OnInitDialog() da seguinte forma:
       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. Selecione Win32 versão compilação VC ++ do comando de menu Build\Set configuração Active Directory.
  5. Compilar e executar o exemplo não MODAL.
  6. Clique em Adicionar na caixa de diálogo. A chamada m_pModeless->Create() no ficheiro Modeldlg.cpp (na linha 178) devolve VERDADEIRO, neste caso a causar o botão Adicionar (para apresentar a caixa de diálogo não modal CAdderDialog) ser desactivada.
(c) 1999 Microsoft Corporation, todos os direitos reservados. Contribuições de Yeong Kah TAM, Microsoft Corporation.

Propriedades

Artigo: 193099 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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