调用Windows WiFi API WlanEnumInterfaces返回ERROR_INVALID_STATE错误的原因咨询
调用Windows WiFi API WlanEnumInterfaces返回ERROR_INVALID_STATE错误的原因咨询
嘿,我一眼就发现你代码里的问题啦!这个ERROR_INVALID_STATE错误的根源在于你用错了API句柄的创建函数。
你现在用的是WFDOpenHandle来获取客户端句柄,但WFD(Windows Direct)是用于点对点无线连接的API,和咱们用来枚举WiFi网络的WLAN API完全不是一套体系。WlanEnumInterfaces只认通过WlanOpenHandle创建的合法WLAN客户端句柄,你给它一个WFD的句柄,它自然会返回状态无效的错误。
给你修正后的代码示例,把句柄创建部分换成正确的WLAN API调用:
#include <wlanapi.h> #pragma comment(lib, "wlanapi.lib") // ... PWLAN_INTERFACE_INFO_LIST pIfList = NULL; DWORD dwNegotiatedVersion; HANDLE hClientHandle; // 用WlanOpenHandle替代WFDOpenHandle DWORD Res = WlanOpenHandle(WLAN_API_VERSION_2_0, NULL, &dwNegotiatedVersion, &hClientHandle); if (Res != ERROR_SUCCESS) { // 注意:如果WlanOpenHandle失败,hClientHandle可能是无效的,不要调用WlanCloseHandle return; } Res = WlanEnumInterfaces(hClientHandle, NULL, &pIfList); if (Res == ERROR_INVALID_STATE) { WlanCloseHandle(hClientHandle, NULL); return; } else if (Res != ERROR_SUCCESS) { WlanCloseHandle(hClientHandle, NULL); return; } // 这里可以处理枚举到的接口列表... // 别忘了释放资源 if (pIfList != NULL) { WlanFreeMemory(pIfList); } WlanCloseHandle(hClientHandle, NULL);
另外还要注意几个小细节:
- 编译时要链接
wlanapi.lib库,上面的代码里用#pragma comment(lib, "wlanapi.lib")帮你自动链接了 - 如果枚举失败,记得及时释放已分配的资源,避免内存泄漏
- 部分Windows环境下,可能需要管理员权限才能正常调用WLAN枚举API,你可以试试以管理员身份运行你的程序
备注:内容来源于stack exchange,提问作者Arun K
相关产品推荐
相关产品推荐

