Artigo: 193101 - Última revisão: quarta-feira, 1 de Junho de 2005 - Revisão: 4.0

CORRECÇÃO: Uma excepção não processada ocorre quando utiliza MFC sockets em threads secundárias numa aplicação MFC Visual C++ 6.0

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 utilizar sockets MFC de threads secundárias numa aplicação Visual C++ 6.0 MFC estaticamente ligada, ocorre uma excepção não processada.

Causa

O motivo para a excepção não processada é um objecto do tipo CMapPtrToPtr ponteiro, apontado pelo m_pmapSocketHandle, nunca é criado.

Resolução

Os mapeamentos de identificador utilizados pelos sockets tem de ser criadas para cada thread. O código seguinte mostra uma função para o fazer:
   void SocketThreadInit()
   {
   #ifndef _AFXDLL
   #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
   #define _afxSockThreadState AfxGetModuleThreadState()

      _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
      if (pState->m_pmapSocketHandle == NULL)
         pState->m_pmapSocketHandle = new CMapPtrToPtr;
      if (pState->m_pmapDeadSockets == NULL)
         pState->m_pmapDeadSockets = new CMapPtrToPtr;
      if (pState->m_plistSocketNotifications == NULL)
         pState->m_plistSocketNotifications = new CPtrList;

   #endif
   }
				
esta função deve ser chamada uma vez em cada thread secundário antes do socket primeiro é criado no novo thread.

Ponto Da Situação

A Microsoft confirmou que este erro ocorre nos produtos do Microsoft listados na secção "Aplica-se a".

Este erro foi corrigido no Visual Studio 6.0 Service Pack 3. Terá de chamar AfxSocketInit() cada módulo que utiliza sockets.

Para mais informações sobre service packs do Visual Studio, faça clique sobre o numberw de artigo seguinte para visualizar o articlew na Microsoft Knowledge Base:
194022  (http://support.microsoft.com/kb/194022/ ) Visual Studio 6.0 service packs, o que, em que, por que razão
194295  (http://support.microsoft.com/kb/194295/ ) Como saber que um Visual Studio service pack está instalado

Mais Informação

Nas aplicações de socket MFC, AfxSocketInit é chamado uma vez, por predefinição, o thread principal. Esta função cria os mapeamentos de identificador do thread principal quando estaticamente ligada MFC. No entanto, quando é criado um thread secundário, não são criados estes mapas de identificador por thread. Tem de ser chamado AfxSocketInit em cada thread para inicializar as bibliotecas de socket.

Passos para reproduzir o comportamento

  1. Cria uma aplicação que cria um socket num thread secundário e utiliza MFC numa biblioteca de ligação estática. Pode utilizar o exemplo de MultiSoc descrito no seguinte artigo da base de dados de conhecimento da alterando as definições do projecto para utilizar MFC numa biblioteca estática:
    175668  (http://support.microsoft.com/kb/175668/ ) MultiSoc: Ilustra utilizar sockets em vários threads
  2. Execute a aplicação e criar um socket num thread secundário.

Referências

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
175668  (http://support.microsoft.com/kb/175668/ ) MultiSoc: Ilustra utilizar sockets em vários threads


A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 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 kbtshoot kbbug kbfix kbnoupdate kbvs600sp3fix kbwinsock KB193101 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: 193101  (http://support.microsoft.com/kb/193101/en-us/ )