CORRECÇÃO: EXE ATL Server com base em CComAutoThreadModule pode travar no registro

Traduções deste artigo Traduções deste artigo
ID do artigo: 202128 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Um servidor ATL EXE com base em CComAutoThreadModule <> pode travar ao que está sendo registrado ou registro cancelado.

Causa

CComAutoThreadModule<>::Init() chamado no WinMain() cria um pool de segmentos (por padrão 4 threads). O destruidor de CComAutoThreadModule global faz determinado que esses segmentos terminar antes do processo termina. Isso acontece postando uma mensagem WM_QUIT para cada um dos threads no pool de segmentos e chamar WaitForSingleObject() o identificador de segmento. Os threads são agendados, que os threads no pool não podem ter chamado GetMessage() e para a fila de mensagens não é criada. Isso faz com que o PostThreadMessage() falha. Portanto, os threads no pool de não encerrar e WaitForSingleObject() aguarda infinitamente os segmentos encerrar.

Resolução

No arquivo Altcom.h, dentro do diretório vc98\atl\include de destruidor na função CComAutoThreadModule substitua o código a seguir:
   ::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0);
				

com este código:
   while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT,
      0, 0) == 0) ::Sleep(100);
				

Situação

A Microsoft confirmou este é um bug em produtos Microsoft listados no começo deste artigo.

Esse problema foi corrigido no Microsoft Visual C++. NET.

Mais Informações

  1. Use Appwizard para criar um EXE ATL .
  2. Insira qualquer tipo de objeto ATL no projeto.
  3. Em stdafx.h, substituir CComModule CComAutoThreadModule<ccomsimplethreadallocator>.
  4. Crie o projeto.

    Observação : há uma chance de que o servidor pode travar neste momento porque a etapa de compilação personalizada registra o servidor.
  5. No menu Configurações do projeto em tipo de guia Debug " / RegServer " na caixa de diálogo Argumentos do programa .
  6. Execute o servidor no depurador.

    Observação : se ele não travar na primeira vez, repita essa etapa. Como isso é tempo relacionado, o problema não pode reproduzir em determinados computadores.

Propriedades

ID do artigo: 202128 - Última revisão: quinta-feira, 11 de dezembro de 2003 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Template Library 3.0 nas seguintes plataformas
    • 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: 
kbmt kbbug kbfix kblocalsvr kbthread KB202128 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: 202128

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