我正在尝试从Rainmeter中编辑PluginSysInfo,以包含IPv6支持。我已经修改了来自SysInfo.cpp的代码,据我所知,包含的链接有我对SysInfo.cpp所做的编辑。
当我在Visual中构建它时,“标识符GetTcp6Table未定义”和“标识符PMIB_IP6TABLE未定义”,即使它们位于包含文件#include 中。
#include <algorithm>
#include <windows.h>
#include <WinSock2.h>
...
MEASURE_IP6_ADDRESS
...
else if (_wcsicmp(L"IP6_ADDRESS", type) == 0)
{
defaultData = 0;
measure->type = MEASURE_IP6_ADDRESS;
}
...
case MEASURE_IP6_ADDRESS:
if (NO_ERROR == GetTcp6Table((PMIB_IP6TABLE)tmpBuffer, &tmpBufferLen, FALSE))
{
PMIB_IP6TABLE TcpTable = (PMIB_IP6TABLE)tmpBuffer;
if (measure->useBestInterface)
{
for (UINT i = 0; i < TcpTable->dwNumEntries; ++i)
{
if (TcpTable->table[i].dwIndex == measure->data)
{
DWORD ip = TcpTable->table[i].dwAddr;
wsprintf(sBuffer, L"%x:%x:%x:%x"/*:%x:%x:%x:%x"*/, ip % 65535, (ip >> 8) % 65535, (ip >> 16) % 65535, (ip >> 24) % 65535);
return sBuffer;
}
}
}发布于 2020-06-23 04:19:18
已知的Win32头<winsock2.h>和<windows.h>之间存在冲突,例如参见1、2。
微软文档建议使用两种#include序列之一。
<windows.h>#include <winsock2.h>
#include <ws2tcpip.h><windows.h>#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>因为GetTcp6Table需要<iphlpapi.h>,所以OP的情况应该使用后一种情况。
引用同一文件:
如果应用程序正在使用IP Helper API,则需要Iphlpapi.h头文件。当需要Iphlpapi.h头文件时,应将Winsock2.h头文件的#行放在Iphlpapi.h头文件的#include行之前。 在Winsock2.h头文件内部包含来自Windows.h头文件的核心元素,因此在Winsock应用程序中通常没有用于Windows.h头文件的#include行。如果Windows s.h头文件需要一个#include行,则应该在前面加上#define WIN32_LEAN_AND_MEAN宏.,由于历史原因,Windows s.h头默认包含WindowsSocket1.1的Winsock.h头文件。Winsock.h头文件中的声明将与WindowsSockets2.0所需的Winsock2.h头文件中的声明冲突。WIN32_LEAN_AND_MEAN宏防止Winsock.h包含在Windows.h头中。
编辑后续的评论,下面是一个完整的片段,正确构建。
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winwock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdlib.h> // _countof
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
int main()
{
BYTE tmpBuffer[7168];
ULONG tmpBufferLen = _countof(tmpBuffer);
return NO_ERROR == GetTcp6Table((PMIB_TCP6TABLE)tmpBuffer, &tmpBufferLen, FALSE);
}https://stackoverflow.com/questions/62527074
复制相似问题