2

我正在尝试在 c++ 应用程序中使用DHCP 服务器管理 API 。当我想使用 DhcpAddServer 函数时,我总是遇到链接器错误(LNK2001 未解析的外部符号 _DhcpAddServer)。所有其他功能似乎都可以正常工作。

我已经尝试过 SDK V7.0A 和 V7.1(目标系统是 Win XP)。

这是一个测试代码:

#include <windows.h>
#include <dhcpsapi.h>
#include <tchar.h>

#pragma comment(lib, "dhcpsapi.lib")

DWORD TestDHCPAddServer();
DWORD TestDHCPGetVersion();

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

DWORD TestDHCPAddServer()
{
    DHCP_SERVER_INFO serverInfo;
    DWORD errorCode=0;

    serverInfo.Version = 0;
    serverInfo.ServerName = L"xxxx";
    serverInfo.ServerAddress = 1234;
    serverInfo.Flags = 0;
    serverInfo.State = 0;
    serverInfo.DsLocation = NULL;
    serverInfo.DsLocType = 0;

    errorCode = DhcpAddServer(0, NULL, &serverInfo, NULL, NULL);

  return errorCode;
}

DWORD TestDHCPGetVersion() 
{
    DWORD majorVersion = 0;
    DWORD minorVersion = 0;
    DWORD errorCode = 0;

    errorCode = DhcpGetVersion(NULL, &majorVersion, &minorVersion);

  return errorCode;
}

删除 TestDHCPAddServer 后,代码会编译,这意味着该 lib 可以正常工作。我还使用了 dumpbin.exe /exports,它说该函数应该在 lib 的两个版本中都可用。

当使用 /verbose 运行链接器时,我可以看到它在 lib 中找到了 DhcpGetVersion,但没有找到 DhcpAddServer。

4

1 回答 1

0

我遇到了同样的问题,并且能够使用编译器选项 /Gz 编译代码(使用调用约定 _stdcall 作为默认值而不是 _cdecl)。在平台 SDK 的 dhcpsapi.h 的给定头文件中,对于某些函数(包括 DhcpAddServer),没有明确给出调用约定。这意味着,使用默认编译器选项 (_cdecl)。但 Win32 Api 的标准是 _stdcall。

于 2015-07-07T14:05:56.073 回答