Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SetIpInterfaceEntry返回错误\u无效\u参数_C++_Winapi - Fatal编程技术网

C++ SetIpInterfaceEntry返回错误\u无效\u参数

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

我试图执行函数,但总是得到错误\u无效\u参数结果。我想更改哪一个确切的参数并不重要,因为即使我没有更改任何东西,我也会遇到这个错误。这里是C++代码示例,它不会改变任何东西,但是输出总是相同的:

// 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;