来源:http://support.microsoft.com/default.aspx?scid=kb;en-us;822334
症状
当你在Microsoft Windows Server2003 或 Mircosoft Windows XP 上运行允许统一码的、使用了FreeAddrInfo Windows Sockets 函数或者用户助手类,例如,ATL::CSocketAddr 的应用程序时,你可能收到下面的错误信息:
无法定位程序输入点FreeAddrinfoW于动态链接库WS2_32.dll上
原因
WS2_32.dll库没有输出 FreeAddrInfoW符号,你必须使用统一码版本的FreeAddrInfo函数。
解决方法
根据下面的步骤来解决这个问题:
1、把Atlsocket.h文件复制到你想使用的任意文件夹中。这个文件位于下面的目录中:
Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include
2、在第一步中创建的Atlsocket.h中,加入下面的代码块
//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、运行Mircosoft Visual C++
4、在工具菜单中单击选项。在选项对话框的左面,打开项目,然后单击VC++目录
注意:如果你使用的是Visual C++ Express版本,在选项对话框的左面,打开项目和方案,然后单击VC++目录
5、在选中包含文件栏,然后把Atlsocket.h文件的修改版本所在的目录增加到列表的顶部。
6、重新建立你的应用程序。
状况
Microsoft已经确认在Microsoft产品中存在这个bug,已经在“Applies to”章中列出
更多消息
产生该问题的步骤
1、启动Microsoft Visual Studio .NET 2003
2、打开文件菜单,指向新建,然后单击项目
3、单击项目类型下面的Visual C++项目,然后单击模板下面的Win32控制台项目
4、在名称一栏中输入Sample,单击确定
5、在Win32 应用程序向导对话框中,应用程序设置中单击选中添加支持下的ATL复选框,单击完成按钮
6、在Sample.cpp文件中,用下面的代码代替存在的默认代码。
#include "stdafx.h"
#include <atlsocket.h>
void _tmain()
{
CSocketAddr aSocketAddr;
}
7、在解决方案资源管理器中右击项目节点,然后选择属性
8、在项目属性页对话框中,单击左面配置属性下的常规。在右面,将字符集属性设置为使用 Unicode 字符集。点击确定
9、在生成菜单中,点击生成解决方案生成应用程序。注意到在生成过程中没有编译错误或链接错误。
10、在调试菜单中,点击开始执行(不调试)。可以注意到,收到了“症状”中描述的错误信息。
应用程序碰到这个问题的解决方法:
属于系统问题,你的系统不支持IPv6,升级到SP1/SP2就能解决