Artigo: 824480 - Última revisão: quinta-feira, 5 de Janeiro de 2006 - Revisão: 2.0

Erro: "HRESULT - 0x80010106" erro ocorre quando executa uma aplicação de Visual C++ gerida no Visual Studio .NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Quando tenta executar uma aplicação C++ gerida que tenha a inicialização COM (Component Object Model) no thread principal, poderá receber a seguinte mensagem de erro em tempo de execução:
HRESULT - 0x80010106 - não é possível alterar modo de thread depois de ser definido.

Causa

Definir o estado de apartamento no thread principal não é fiável.

Resolução

A função principal não é o ponto de entrada gerido real. O ponto de entrada gerido real é o ponto de entrada de bibliotecas de tempo de execução C (CRT). Para resolver este problema, escrever o ponto de entrada gerido e manualmente inicializar o CRT da seguinte forma:
#define _WIN32_WINNT 0x501
#include <objbase.h>
#include <stdio.h> 

#using <mscorlib.dll>
using namespace System;

extern "C" void mainCRTStartup();

[System::STAThread]
int mymain()  //the new entry point
{
	//Initialize COM
	HRESULT hr = CoInitialize(0);
	
	//Initialize the CRT
	mainCRTStartup();
	//uninit
	CoUninitialize();
	return 0;
}
 

int main()
{
	/*
   Do the application work 
   that you would do in your main thread
   */
}
especificar explicitamente o ponto de entrada para a função mymain . Para o fazer, siga estes passos:
  1. Clique em projecto e, em seguida, clique em Propriedades .
  2. Na caixa de diálogo Páginas de propriedades , expanda Ligador em Propriedades de configuração e, em seguida, clique para seleccionar Avançadas .
  3. Na caixa de texto Ponto de entrada , escreva mymain e, em seguida, clique em OK .

Ponto Da Situação

A Microsoft confirmou que este erro ocorre nos produtos da Microsoft listados no início deste artigo.

Mais Informação

Quando o common language runtime tem de utilizar o COM (Component Object Model) sempre antes de inicia a aplicação de utilizador, o common language runtime chama o método CoInitializeEx para inicializar o thread principal multi-threaded apartment (MTA, Message). No entanto, o common language runtime chama o método CoInitializeEx apenas conforme necessário. O common language runtime não determinista. Normalmente, aplicações que requerem um único-threaded apartment (STA) para o thread principal em vez disso, devem aplicar o atributo STAThread no ponto de entrada. Além disso, em C++ a entrada de utilizador de pontos (o método main e respectivas variantes) não é um ponto de entrada gerido true. As bibliotecas de tempo de execução C fornecer os pontos de entrada para aplicações da consola e para aplicações do windows.

Passos para reproduzir o comportamento 1

  1. Inicie o Microsoft Visual Studio .NET 2003.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Expanda Visual C++ projectos em Project Types , clique em MFC e, em seguida, clique em Aplicação MFC em Templates .
  4. Escreva MFCTest na caixa de texto Nome , escreva C:\ na caixa de texto de localização e, em seguida, clique em OK .
  5. No Assistente de Aplicação MFC , clique em Compound suporte de documento .
  6. Em Compound suporte de documento , clique para seleccionar contentor/E servidor e, em seguida, clique em Concluir .
  7. No Solution Explorer, clique com o botão direito do rato MFCTest e, em seguida, clique em Propriedades .
  8. Na caixa de diálogo Páginas de propriedades , expanda C/C ++ em Propriedades de configuração .
  9. Definir o Formato de informações de depuração propriedade para desactivado .
  10. Expanda a Geração de código e, em seguida, definir as seguintes propriedades:
    • Defina a propriedade Base tempo de execução de verificações para predefinido .
    • Definir Activar mínima recriar a propriedade para não .
  11. Expandir linha de comandos e, em seguida, escreva / clr na caixa de texto Opções adicionais .
  12. Clique em Aplicar e, em seguida, clique em OK .
  13. Compilar a aplicação.
  14. No menu Debug , clique em Iniciar para depurar a aplicação. Poderá receber a mensagem de erro é descrita na secção "Sintomas" deste artigo.

Passos para reproduzir o comportamento 2

  1. Inicie o Visual Studio .NET 2003.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Expanda Visual C++ projectos em Project Types , clique em .NET e clique em Consola de aplicações (NET) em modelos .
  4. Escreva ProjectoTeste na caixa de texto Nome , escreva C:\ na caixa de texto de localização e, em seguida, clique em OK .
  5. No Solution Explorer, faça duplo clique em TestProject.cpp e, em seguida, substitua o código existente com o seguinte código:
    #include "stdafx.h"
    #define _WIN32_WINNT 0x501 
    #include <objbase.h>
    #include <stdio.h> 
    
    #using <mscorlib.dll>
    using namespace System;
    
    int main()
    
    {
    	HRESULT hr = CoInitialize(0);
    	printf("hr in main thread is %d \n",hr);
    }
  6. Criar e, em seguida, execute o projecto. Poderá receber o erro de tempo de execução que é descrito na secção "Sintomas" deste artigo.
Este problema poderá também ocorrer em C++ gerido aplicações os seguintes cenários:
  • Quando a aplicação deve chamar o método CoInitializeEx para inicializar o thread principal para o STA.
  • Quando compilar MFC OLE com aplicações utilizando o / clr opção.
  • Quando executa uma aplicação Windows Forms gerado pelo assistente.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ .NET 2003 Standard Edition
Palavras-chave: 
kbmt kberrmsg kbthread kbcodegen kbcrt kbappwizard kbbug KB824480 KbMtpt
Tradução automáticaTraduçã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: 824480  (http://support.microsoft.com/kb/824480/en-us/ )