Recebe uma mensagem de erro "Sistema erro & H80004005" a partir de uma aplicação do Visual Basic 6.0 quando um subclasses de controlo ActiveX MFC das classes de janela implementadas por Comctl32.dll

Traduções de Artigos Traduções de Artigos
Artigo: 223152 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Um ActiveX de MFC controlar esse subclasses das classes de janela implementados pelo Comctl32.dll faz com que o erro seguinte ser iniciadas a partir de um exe de Visual Basic 6.0.
"Sistema erro & H80004005 (-2147467259). Erro não especificado"
A versão de depuração do controlo ActiveX faz com que um ASSERT no ficheiro Ctlcore.cpp, no fim da COleControl::CreateControlWindow, ou junto da linha 662.

Este problema ocorre apenas quando criar uma .exe a partir do Visual Basic 6.0 e executá-la a partir de fora do ambiente de desenvolvimento do Visual Basic.

Causa

Executáveis do Microsoft Visual Basic não inicializar a biblioteca de controlo comuns (Comctl32.dll) por predefinição, resultando no CreateEx chamada falhar em COleControl::CreateControlWindow. Chamar GetLastError() fornece 0x0000057F - não é possível localizar a classe de janela, que indica a biblioteca comum do controlo tem de ser explicitamente inicializada.

Resolução

Dentro InitInstance do controlo ActiveX, efectuar uma chamada para:
InitCommonControls(void)
ou
InitCommonControlsEx(LPINITCOMMONCONTROLSEX lpInitCtrls)
Isto garante que Comctl32.dll é carregado e inicializado, independentemente do contentor o controlo está em execução no.

Em vez de chamar InitCommonControls do código do controlo, também pode chamá-lo directamente da aplicação do cliente do Visual Basic:
  • Criar uma declaração geral para o formulário correspondente; por exemplo:
    Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
  • Adicionar uma chamada para:
    InitCommonControls
    					
    no método Form_Load.
Em algumas situações, este poderá ser demasiado tarde inicializar a biblioteca de controlos comuns. Por conseguinte, recomenda-se para adicionar esta chamada InitInstance do controlo.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. Utilizando o Visual C++, Assistente de controlo ActiveX MFC, criar um controlo de ActiveX predefinido.
  2. Na secção Definições de controlo de AppWizard (passo 2 do AppWizard de 6.0 Visual C++), na classe de janela para subclasse, escolha um dos seguintes procedimentos: msctls_hotkey32, msctls_progress32, SysTabControl32 msctls_statusbar32, msctls_trackbar32, msctls_updown32, SysAnimate32, SysHeader32, SysListView32, ou SysTreeView32.
  3. Crie o controlo.
  4. Abra o Microsoft Visual Basic 6.0 e crie um novo projecto Exe padrão.
  5. A partir do menu projecto , clique em componentes e seleccione o controlo que acabou de criar utilizando o Microsoft Visual C++.
  6. Seleccione este controlo e que desenhar no formulário da janela.
  7. No menu ficheiro , clique em Criar Project.exe e criar o exe.
  8. Vá para O Explorador do Windows e execute este executável.

Propriedades

Artigo: 223152 - Última revisão: 21 de novembro de 2006 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Visual Basic 5.0 Learning Edition
    • Microsoft Visual Basic 6.0 Learning Edition
    • Microsoft Visual Basic 5.0 Professional Edition
    • Microsoft Visual Basic 6.0 Professional Edition
    • Microsoft Visual Basic 5.0 Enterprise Edition
    • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palavras-chave: 
kbmt kberrmsg kbtshoot kbcmnctrls kbctrl kbprb KB223152 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: 223152

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