ID do artigo: 193101 - Última revisão: quarta-feira, 1 de junho de 2005 - Revisão: 4.0

CORRECÇÃO: Uma exceção sem tratamento ocorre quando você usa soquetes MFC em segmentos secundários em um aplicativo 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 | Recolher tudo

Sintomas

Ao usar soquetes MFC em segmentos secundários em um aplicativo Visual C++ 6.0 MFC vinculado estaticamente, ocorre uma exceção sem tratamento.

Causa

O motivo para a exceção sem tratamento é que um objeto do tipo ponteiro CMapPtrToPtr, apontado pelo m_pmapSocketHandle, nunca é criado.

Resolução

Os mapas de identificador usados pelos soquetes precisam ser criados para cada segmento. O código a seguir mostra uma função para fazer isso:
   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 que o primeiro soquete é criado no novo segmento.

Situação

A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Esse bug foi corrigido no Visual Studio 6.0 Service Pack 3. Você precisará chamar AfxSocketInit() em cada segmento que usa soquetes.

Para obter mais informações sobre service packs do Visual Studio, clique no numberw de artigo seguinte para ler o articlew no Base de dados de Conhecimento da Microsoft:
194022  (http://support.microsoft.com/kb/194022/ ) O Visual Studio 6.0 service packs, o que, em que, por que
194295  (http://support.microsoft.com/kb/194295/ ) Como saber se um service pack do Visual Studio está instalado

Mais Informações

Em aplicativos de soquete MFC, AfxSocketInit é chamado uma vez, por padrão, no thread principal. Esta função cria os mapas de identificador para o segmento principal quando estaticamente vinculada ao MFC. No entanto, quando um thread secundário é criado, esses mapas de identificador por thread não são criados. AfxSocketInit deve ser chamado em cada segmento para inicializar as bibliotecas de soquete.

Etapas para reproduzir o comportamento

  1. Crie um aplicativo que cria um soquete em um thread secundário e usa MFC em uma biblioteca de vínculo estático. Você pode usar o exemplo MultiSoc descrito no seguinte artigo Knowledge alterando as configurações de projeto para usar MFC em uma biblioteca estática:
    175668  (http://support.microsoft.com/kb/175668/ ) MultiSoc: Ilustra usando soquetes em vários segmentos
  2. Execute o aplicativo e criar um soquete em um thread secundário.

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
175668  (http://support.microsoft.com/kb/175668/ ) MultiSoc: Ilustra usando soquetes em vários segmentos


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 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: 193101  (http://support.microsoft.com/kb/193101/en-us/ )