Artigo: 822334 - Última revisão: quinta-feira, 19 de Abril de 2007 - Revisão: 3.5

Erro: Não é possível localizar o FreeAddrInfoW de ponto de entrada procedimento quando executa uma aplicação no Windows Server 2003 ou no Windows XP

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.
Nota Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Quando executa uma aplicação compatível com Unicode que utiliza a função dos sockets do Windows FreeAddrInfo ou que utiliza classes de programa auxiliar como ATL::CSocketAddr num computador com o Microsoft Windows Server 2003 ou Microsoft Windows XP, poderá receber a seguinte mensagem de erro:
Não foi possível localizar o FreeAddrInfoW de ponto de entrada de procedimento na biblioteca de ligação dinâmica WS2_32.dll.

Causa

A biblioteca ws2_32.dll não exporta o símbolo de FreeAddrInfoW que deva ter para utilizar a versão Unicode da função FreeAddrInfo .

Resolução

Para resolver este problema, siga estes passos:
  1. Copie o ficheiro Atlsocket.h para qualquer directório que pretende utilizar. Este ficheiro está localizado no seguinte directório:
    Programa Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include
  2. Adicione o seguinte bloco de código na cópia do ficheiro Atlsocket.h que criou no passo 1.
    //Atlsocket.h
    #pragma comment(lib, "ws2_32.lib")
    #pragma comment(lib, "mswsock.lib")
    //Start of Addition
    #if _WIN32_WINNT < 0x0502
      #define ADDRINFOT addrinfo
      #define GetAddrInfo getaddrinfo
      #define FreeAddrInfo freeaddrinfo
    #endif
    //End of Addition namespace ATL
  3. Inicie o Microsoft Visual C++.
  4. No menu Ferramentas , clique em Opções . No painel da esquerda da caixa de diálogo Opções , expanda projectos e, em seguida, clique em VC ++ directórios .

    Nota Se estiver a utilizar o Visual C++ Express Edition, expandir e soluções de projectos no painel esquerdo da caixa de diálogo Opções e, em seguida, clique em Directórios VC ++ .
  5. Em Mostrar directórios para , clique em ficheiros de inclusão . Em seguida, adicione o directório onde a versão modificada do ficheiro Atlsocket.h está localizada à parte superior da lista.
  6. Recriar a aplicação

Ponto Da Situação

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

Mais Informação

Passos para reproduzir o problema

  1. Inicie o Microsoft Visual Studio .NET 2003.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Clique em projectos do Visual C++ em Project Types . Clique Win32 consola Project em modelos .
  4. Na caixa nome , escreva exemplo e, em seguida, clique em OK .
  5. Na caixa de diálogo Assistente de aplicação de Win32 , clique para seleccionar as caixas de verificação Adicionar suporte para em Definições da aplicação e ATL e, em seguida, clique em Concluir .
  6. No ficheiro Sample.cpp, substitua o código predefinido existente com o seguinte código.
    #include "stdafx.h"
    #include <atlsocket.h>
    
    void _tmain()
    {
    	CSocketAddr aSocketAddr;
    }
  7. No Solution Explorer, clique com o botão direito do rato no nó de projecto e, em seguida, clique em Propriedades .
  8. Na projecto Páginas de propriedades da caixa de diálogo, clique em Geral em Propriedades de configuração no painel da esquerda. No painel da direita, defina o caracteres definir propriedade para Conjuntos de caracteres do utilizar Unicode . Clique em OK .
  9. No menu criar , clique em criar soluções para compilar a aplicação. Poderá notar que não erros de compilação ou erros de ligação ocorrem durante o processo de criação.
  10. No menu Debug , clique em Iniciar sem depuração . Poderá notar que receberá a mensagem de erro descrita na secção "Sintomas".
No Windows Server 2003 e no Windows XP, as funções de sockets do Windows novas são adicionadas à API de sockets do Windows. GetAddrInfo e FreeAddrInfo são duas novas sockets do Windows funções que são adicionadas para lidar com o protocolo Internet versão 6 (IPv6) e o protocolo Internet versão 4 (IPv4) endereços. A classe de biblioteca do modelo de Active Directory (ATL) 7.1 CSocketAddr utiliza estas novas funções do Windows Sockets para fornecer suporte para IPv6. Outras classes ATL e Microsoft Foundation Classes (MFC) também utilizam a classe CSocketAddr para fornecer suporte de IPv6. Por exemplo, a classe CAsyncSocket e a classe CSMTPConnection utilize a classe CSocketAddr .

Nota A classe CAsyncSocket é uma classe MFC. A classe CSMTPConnection é uma classe ATL.

O problema é descrito em "Sintomas" secção ocorre em qualquer aplicação compatível com o Unicode utiliza a função de sockets do Windows FreeAddrInfo num computador com o Windows Server 2003 ou Windows XP. Uma vez que a classe ATL CSocketAddr utiliza a função FreeAddrInfo , o mesmo problema também ocorre no ATL 7.1. Qualquer classe no ATL 7.1 e 7.1 MFC que utiliza a classe CSocketAddr para activar o suporte IPv6 reflecte este comportamento. Por exemplo, a classe CAsyncSocket e a classe CSMTPConnection utilize a classe CSocketAddr .

Classes de servidor ATL como CAtlHttpClient e CSoapSocketClientT utilizem a classe ZEvtSyncSocket e apresentam o mesmo erro. Este comportamento ocorre porque a classe interna ZEvtSyncSocket utiliza a classe CSocketAddr na respectiva implementação.

Nota A classe CAtlHttpClient fornece suporte de clientes HTTP. A classe CSoapSocketClientT fornece suporte a clientes serviços Web XML.

Referências

Para mais informações sobre as alterações foram efectuadas ATL, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/aa983525(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/aa983525(VS.71).aspx)
Para obter mais informações sobre novas funções do Windows Socket que foram adicionados à API de sockets do Windows, visite o seguinte site da Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms740642.aspx (http://msdn2.microsoft.com/en-us/library/ms740642.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition nas seguintes plataformas
    • Microsoft Windows Server 2003 Datacenter Edition
    • Microsoft Windows Server 2003 Enterprise Edition
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003 Web Edition
    • Microsoft Windows XP Professional Edition
    • Microsoft Windows XP Home Edition
Palavras-chave: 
kbmt kbwinsock kbapi kbappdev kbbug KB822334 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: 822334  (http://support.microsoft.com/kb/822334/en-us/ )