【发布时间】:2018-09-06 04:00:53
【问题描述】:
我的应用程序可以为 DHCP 或静态配置关闭或启用网络适配器。 IP 配置是通过 WMI Win32_NetworkAapterConfiguration 类完成的,出于某些原因,禁用/启用适配器是通过 SetupApi 完成的。从启用适配器开始,我注意到以下内容(Windows 7 SP1,32 位):
EnableDHCP 方法返回错误 84(未启用 IP)。所以我认为我需要等待该属性“IpEnabled”变为真并每秒轮询一次 - 但它总是返回假(顺便说一句:我使用 WMIC 监控了该值,并且可以看到它实际上已变为真)。
接下来——为了避免无限循环——我改变了我的“poll 'IpEnabled == true'循环”,在 10 次试验后跳出,然后做剩下的事情。并看到:EnableDHCP 成功(ret == 0),IpEnabled 也突然变为 true。
编辑
情况1:
int ret;
// ...
// Returns error 84
ret = wmiExecMethod(clsName, "EnableDHCP", true, objPath);
// ...
情况2:
int ret;
// ...
// Will never get out of this
while (!wmiGetBool(pWMIObj, "IPEnabled"))
{
printf("Interface.IpEnabled=False\n");
Sleep(1000);
}
// ...
ret = wmiExecMethod(clsName, "EnableDHCP", true, objPath);
情况3:
int count = 10;
int ret;
// ...
// Will occur until count becomes 0
while (wmiGetBool(pWMIObj, "IPEnabled") && count--)
{
printf("Interface.IpEnabled=False - remaining trials: %d\n", count);
Sleep(1000);
}
// ...
// After this "delay", EnableDHCP returns 0 (SUCCESS)
ret = wmiExecMethod(clsName, "EnableDHCP", true, objPath);
// wmiGetBool(pWMIObj, "IPEnabled") now returns true too...
您知道这里出了什么问题吗?感谢之前的帮助。
最好的问候 威利 K。
【问题讨论】:
-
我的水晶球说您忘记在循环内重新运行查询。强迫我们猜测何时可以简单地将代码复制/粘贴到问题中并没有多大意义。
-
一些更正:即使在“EnableDHCP”成功后,“IpEnabled”仍然是错误的,但是,我目前的解决方法是调用 EnableDHCP,直到它成功进行有限次数的重试。如果有人有更好的想法,我会很高兴听到。
标签: c windows networking wmi