Você recebe uma mensagem de erro "Erro & H80004005 de sistema" de um aplicativo Visual Basic 6.0, quando um subclasses de controle MFC ActiveX qualquer uma das classes janela implementado por Comctl32.dll

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: 223152
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Um ActiveX MFC controlar que subclasses qualquer uma das classes janela implementado pelo Comctl32.dll faz com que o seguinte erro a ser lançada de um .exe Visual Basic 6.0.
"Sistema erro & H80004005 (-2147467259). Erro não especificado"
A versão de depuração do controle ActiveX faz com que uma declaração no arquivo Ctlcore.cpp, no final do COleControl::CreateControlWindow, em ou próximo à linha 662.

Esse problema ocorre somente quando você cria um .exe do Visual Basic 6.0 e executá-lo de fora do ambiente de desenvolvimento do Visual Basic.
Causa
Executáveis do Microsoft Visual Basic não inicializar a biblioteca de controle comuns (Comctl32.dll) por padrão, resultando no CreateEx chamada falhando em COleControl::CreateControlWindow. Chamar GetLastError() fornece 0x0000057F - não é possível encontrar classe da janela, que indica a biblioteca de controle comum precisa ser explicitamente inicializados.
Resolução
Dentro de CWinAppEx do seu controle ActiveX, fazer uma chamada para:
InitCommonControls(void)
ou
InitCommonControlsEx(LPINITCOMMONCONTROLSEX lpInitCtrls)
isso garante que Comctl32.dll é carregado e inicializado, independentemente do recipiente o controle está sendo executado no.

Em vez de chamar InitCommonControls do código do controle, você também pode chamá-lo diretamente do aplicativo cliente Visual Basic:
  • Fazer uma declaração geral para o formulário correspondente; por exemplo:
    Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
  • Adicione uma chamada para:
    InitCommonControls					
    no método Form_Load.
Em algumas situações, isso pode ser muito tarde inicializar a biblioteca de controles comuns. Portanto, é recomendável adicionar essa chamada no CWinAppEx do controle.
Situação
Esse comportamento é por design.
Mais Informações

Etapas para reproduzir o problema

  1. Usando o Visual C++, Assistente de controle ActiveX MFC, criar um controle padrão.
  2. Na seção configurações de controle do AppWizard (etapa 2 do AppWizard de 6.0 Visual C++), na classe de janela a subclasse, escolha uma das seguintes opções: msctls_hotkey32, msctls_progress32, SysTabControl32 msctls_statusbar32, msctls_trackbar32, msctls_updown32, SysAnimate32, SysHeader32, SysListView32, ou SysTreeView32.
  3. Crie o controle.
  4. Abra o Microsoft Visual Basic 6.0 e crie um novo projeto Standard EXE.
  5. A partir do menu Project , clique em componentes e selecione o controle que você acabou de criar usando Microsoft Visual C++.
  6. Selecione esse controle e desenhar que no formulário de janela.
  7. No menu arquivo , clique em Criar Project.exe e criar o exe.
  8. Vá para o Windows Explorer e execute este executável.
Comctl32.dll MFC VB

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 223152 - Última Revisão: 12/05/2015 13:32:25 - Revisão: 3.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kberrmsg kbtshoot kbcmnctrls kbctrl kbprb KB223152 KbMtpt
Comentários