C++ SetIpInterfaceEntry返回错误\u无效\u参数
我试图执行函数,但总是得到错误\u无效\u参数结果。我想更改哪一个确切的参数并不重要,因为即使我没有更改任何东西,我也会遇到这个错误。这里是C++代码示例,它不会改变任何东西,但是输出总是相同的:C++ SetIpInterfaceEntry返回错误\u无效\u参数,c++,winapi,C++,Winapi,我试图执行函数,但总是得到错误\u无效\u参数结果。我想更改哪一个确切的参数并不重要,因为即使我没有更改任何东西,我也会遇到这个错误。这里是C++代码示例,它不会改变任何东西,但是输出总是相同的: // Initialize MIB_IPINTERFACE_ROW with actual InterfaceLuid: auto row = MIB_IPINTERFACE_ROW{ AF_INET, 1689399632855040 }; auto result = GetIpInterface
// Initialize MIB_IPINTERFACE_ROW with actual InterfaceLuid:
auto row = MIB_IPINTERFACE_ROW{ AF_INET, 1689399632855040 };
auto result = GetIpInterfaceEntry(&row);
// Just to confirm GetIpInterfaceEntry success print result and InterfaceIndex:
std::cout << "GetIpInterfaceEntry result: " << result << "; InterfaceIndex: " << row.InterfaceIndex << std::endl;
// Try to execute SetIpInterfaceEntry, without any change:
result = SetIpInterfaceEntry(&row);
// Result is always ERROR_INVALID_PARAMETER (87):
std::cout << "SetIpInterfaceEntry result: " << result << std::endl;
根据,错误\无效\参数的可能原因如下:
传递给函数的参数无效。如果在Row参数中传递空指针,Row参数指向的MIB_iInterface_行的族成员未指定为AF_INET或AF_INET6,或者Row参数指向的MIB_iInterface_行的InterfaceId或InterfaceIndex成员未指定,则返回此错误
在我的例子中,这两个都不可能是真的,我刚刚得到了实际的结构
我的问题很明显:我做错了什么?对调用该方法的接口类型是否有任何限制?我在打物理电话。还有其他建议吗
谢谢
更新:我忘了提到,如果要执行此代码段,您应该:
#include <winsock2.h>
#include <netioapi.h>
还要链接iphlapi.lib。解决了这个问题,多亏了我的同事 原因在于,在我的案例中,row.SitePrefixLength字段最初设置为64,这是一个非法值,根据: 对于IPv4地址,任何大于32的值都是非法值 在打电话之前,我插入了下面的一行,一切都很顺利:
row.SitePrefixLength = 0;
虽然它解决了问题,但仍然有一些悬而未决的问题:
实际当前值无效是如何发生的?
如果遇到一个无效值,应该输入什么值?看起来将其设置为0就是答案,但我不确定这一点。
但首先,我应该了解SitePrefixLength字段/参数的用途:
更新:我刚刚找到了我剩下的第二个问题的答案——我一直为没有阅读所有内容而感到羞愧。所以答案是:
对于IPv4,SitePrefixLength成员必须设置为0
如果将row.Family指定为AF_INET6会发生什么情况?我无法用您的代码复制它,SetIpInterfaceEntry刚刚在Win101809上成功返回0,生成17763。你能提供你的环境信息吗?
row.SitePrefixLength = 0;