1

我有一些代码可以成功迭代Wi-Fi网络列表,并提供有关可用网络的反馈。这里显示的基本通话...从连接管理器获取Wi-Fi连接状态

WlanOpenHandle(WLAN_API_VERSION, NULL, &dwVersion, &hSession); 

PWLAN_INTERFACE_INFO_LIST pInterfaceInfoList = NULL; 
WlanEnumInterfaces(hSession, NULL, &pInterfaceInfoList); 

for(int i ...) 
{ 
    PWLAN_AVAILABLE_NETWORK_LIST pAvailableNetworkList = NULL; 
    WlanGetAvailableNetworkList(hSession, &interfaceGUID, 
      WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES | 
      WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES, 
      NULL, &pAvailableNetworkList); 
    for(int j ...) 
    { 
     WLAN_AVAILABLE_NETWORK network = pAvailableNetworkList->Network[j]; 
     : 
    } 
} 

这一切工作正常,而内环内,我能够访问所有我需要的属性,如信号强度,安全标志等通过的网络数据结构。我不是能获得

的一件事是关于信息的连接状态,如验证或AUTHENTICATION_FAILED,等等,所以我试图引进如下环路内的另一个电话...

CM_CONNECTION_DETAILS connectionDetails; 
memset(&connectionDetails, 0, sizeof(CM_CONNECTION_DETAILS)); 

connectionDetails.Version = CM_CURRENT_VERSION; 
const char* ccp = reinterpret_cast<const char*>(network.dot11Ssid.ucSSID); 
mbstowcs(connectionDetails.szName, &ccp[0], network.dot11Ssid.uSSIDLength); 

DWORD dwCount = sizeof(CM_CONNECTION_DETAILS); 

CM_RESULT cmr = CmGetConnectionDetailsByName(connectionDetails.szName, 
      &connectionDetails, &dwCount); 

if (cmr == CMRE_SUCCESS) 
{ 
    : 
} 

在调用CmGetConnectionDetailsByName()函数后,CM_CONNECTION_DETAILS结构中的详细信息看起来是正确的(名称和版本),但该函数返回CMRE_INVALID_CONNECTION并且结构未被填充。

我一直没有找到任何这个调用成功的例子(只有几个引用返回相同的CMRE_INVALID_CONNECTION代码的调用)。

有没有人有任何成功使用呼叫的经验,或者提出一个更好的方法来找出网络的连接状态(即如果AUTHENTICATION正在进行或者如果AUTHENTICATION失败等)?

[我使用Visual Studio 2013 C++(原生Windows应用程序,而不是MFC),目标是32位和Unicode,在Windows上运行的紧凑2013]

回答

0

了以下功能并不完全给我我正在寻找的很好的控制,但它至少让我有机会找到一个特定的接口状态。这意味着我可以找出接口当前是处于进程还是进行身份验证,并根据最终状态是连接还是断开连接,我可以确定身份验证是否成功。

WLAN_INTERFACE_STATE getNetworkState(HANDLE hSession, GUID* pGUID, std::wstring& wsState, bool bReportState=true) 
{ 
    WLAN_INTERFACE_STATE result = wlan_interface_state_not_ready; 
    DWORD dwDataSize; 
    void* pData; 
    DWORD dwErrorCode = WlanQueryInterface(hSession, pGUID, wlan_intf_opcode_interface_state, NULL, &dwDataSize, &pData, NULL); 
    if (dwErrorCode == ERROR_SUCCESS && pData != NULL) 
    { 
     WLAN_INTERFACE_STATE* pState = reinterpret_cast<WLAN_INTERFACE_STATE*>(pData); 
     if (pState != NULL) 
     { 
      switch (*pState) 
      { 
      case wlan_interface_state_not_ready:    wsState = L"NOT_READY"; break; 
      case wlan_interface_state_connected:    wsState = L"CONNECTED"; break; 
      case wlan_interface_state_ad_hoc_network_formed: wsState = L"AD_HOC_NETWORK_FORMED"; break; 
      case wlan_interface_state_disconnecting:   wsState = L"DISCONNECTING"; break; 
      case wlan_interface_state_disconnected:    wsState = L"DISCONNECTED"; break; 
      case wlan_interface_state_associating:    wsState = L"ASSOCIATING"; break; 
      case wlan_interface_state_discovering:    wsState = L"DISCOVERING"; break; 
      case wlan_interface_state_authenticating:   wsState = L"AUTHENTICATING"; break; 
      } 
      result = *pState; 
     } 
     WlanFreeMemory(pData); 
    } 
    return result; 
} 

此检查的局限性,就是它不容易支持在同一接口上的多个连接,这个查询不允许我们查询到的连接状态是指。

如果我得到一个更好的解决方案,我会在这里报告。