首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在雨量计中添加ipv6支持

在雨量计中添加ipv6支持
EN

Stack Overflow用户
提问于 2020-06-23 03:54:50
回答 1查看 124关注 0票数 0

我正在尝试从Rainmeter中编辑PluginSysInfo,以包含IPv6支持。我已经修改了来自SysInfo.cpp的代码,据我所知,包含的链接有我对SysInfo.cpp所做的编辑。

当我在Visual中构建它时,“标识符GetTcp6Table未定义”和“标识符PMIB_IP6TABLE未定义”,即使它们位于包含文件#include 中。

https://pastebin.com/N30HYRVe

代码语言:javascript
复制
#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;
                        }
                    }
                }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-23 04:19:18

已知的Win32头<winsock2.h><windows.h>之间存在冲突,例如参见12

微软文档建议使用两种#include序列之一。

  • <windows.h>
代码语言:javascript
复制
#include <winsock2.h>
#include <ws2tcpip.h>
  • <windows.h>
代码语言:javascript
复制
#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头中。

编辑后续的评论,下面是一个完整的片段,正确构建。

代码语言:javascript
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62527074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档