【问题标题】:GetAddrInfo identifier not found未找到 GetAddrInfo 标识符
【发布时间】:2016-07-25 13:44:26
【问题描述】:

在尝试编译 DLL 以用于将在 Windows XP 上运行的程序时,我遇到了几个错误。它们都相似:“GetAddrInfo:未找到标识符”和“FreeAddrInfo:未找到标识符”。我的能力有限(我必须修改自 2012 年以来尚未更新的现有代码。我是一名合作社,所以我的计算机科学学位尚未完成,我可能不知道某些事情)。我在静态库中使用 MFC。我的平台工具集是 Visual Studio 2013 - Windows XP (v120_xp)。我正在使用 Microsoft Visual Studio Professional 2013。我的 StdAfx.h 包含以下代码:

#ifndef WINVER
#define WINVER 0x0501
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#define VC_EXTRALEAN
//...
#include <WinSock2.h>

我收到错误的 Foo.cpp 文件包括以下标头:

#include "stdafx.h"
#include <stdio.h>
#include <WinIoctl.h>
#include <process.h>    
#include <Windows.h>
#include <MMSystem.h>
#include <Mstcpip.h>
#include <WS2tcpip.h>

我的 WS2tcpip.h 版本来自 Windows 7.1A SDK。如果我打开它,我可以看到 GetAddrInfo() 和 FreeAddrInfo() 已定义,但无论出于何种原因,VS2013 都没有找到这些定义(尽管它可以找到头文件本身并且没有问题包括他们)。

附加说明:如果我将 StdAfx.h 中的#defines 更改为:

#define WINVER 0x0600
#define _WIN32_WINNT 0x0600

并使用常规的 Visual Studio 2013 工具集,编译 DLL 没有问题。不幸的是,DLL 必须在 Windows XP 上工作。我一直找不到任何关于为什么会这样的信息。我的包含可能是在错误的地方吗?

【问题讨论】:

    标签: c++ visual-studio-2013 mfc


    【解决方案1】:

    来自getaddrinfodocumentation page

    支持的最小客户端 | Windows 8.1、Windows Vista

    但是:

    getaddrinfo 函数已添加到 Windows XP 及更高版本的 Ws2_32.dll 中。

    您只需要在 SP2 之前的 XP 上使用 getaddrinfo 而不是 GetAddrInfo。在 XP SP2 及更高版本上,您的代码可以正常工作,无需执行任何操作。
    附带说明一下,ASCII 模式下的GetAddrInfoGetAddrInfoA 的别名,而getaddrinfo 实际上是getaddrinfo 的别名(即使在最近的Windows 上也是如此),因此使用其中一个并不重要。

    奖金:

    在 XP 之前的版本(例如,Windows 2000)上,您需要包含一个额外的标头 Wspiapi.h,以模拟 getaddrinfo

    要在早期版本的 Windows 上执行使用此功能的应用程序,您需要包含 Ws2tcpip.h 和 Wspiapi.h 文件。添加Wspiapi.h包含文件时,getaddrinfo函数被定义到Wspiapi.h文件中的WspiapiGetAddrInfo内联函数中。

    【讨论】:

    • 将#include (在上面或下面)我包含在 Foo.cpp 中的 WS2tcpip.h 并没有解决问题。我仍然遇到同样的错误。
    • @GnoveltyGnome 您需要使用getaddrinfo 而不是GetAddrInfo。这是 POSIX 名称(getaddrinfo 是一个 POSIX 函数)。
    • 修复了它。作为参考(我忘了把这个放在我的问题中),我之前被告知不要修改 Foo.cpp 中的函数调用。我必须征求许可才能进行更改。如果您在答案中加上 POSIX 位,我会接受!
    • @GnoveltyGnome 实际上,您真的坚持使用 XP SP1 吗? XP SP2 带来了很多东西,包括GetAddrInfo。实际上,它并没有太大变化,因为GetAddrInfogetaddrinfo 的别名,即使在最近的Windows 上也是如此。无论如何,您似乎甚至不需要Wspiapi.h,即使对于 XP SP1 也是如此;只是当WINVER &gt;= 0x502时,有一个定义将GetAddrInfo别名为getaddrinfo。我正在改变我的答案以反映这一点。哦,XP SP2 带来了GetAddrInfoW,unicode 版本。
    • 原来我不限于SP1!我不熟悉各种服务包以及它们的作用(在我的编程时间之前)。计算机正在运行 XP SP3。如果我将 StdAfx.h 中的#define WINVER 更改为 0x0502,DLL 将编译。我能够删除 WSPiApi.h 并将我的更改恢复为 Foo.cpp。
    【解决方案2】:

    仅仅是因为GetAddrInfo 在 Windows XP 上不受支持。如果一定要使用这个函数,高版本操作系统可以使用GetProcAddress获取这个函数的地址,动态调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多