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]; 
     : 
    } 
} 

このすべてが正常に動作し、内部ループ内で私は、このような経由など信号強度、セキュリティフラグ、として私は必要な属性のすべてにアクセスすることができますよネットワークデータ構造。

私が取得することはできませんよ一つのことは、このようななどAUTHENTICATINGや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コードを返すコールへの参照が2つしかありません)。

誰でも、コールを正常に使用した経験がありますか、ネットワークの接続状態を知る良い方法を示唆していますか(つまり、認証が進行中か、認証が失敗した場合など)

[Iは、Visual Studio 2013 C++(ネイティブのWindowsアプリではなく、MFC)を使用しています、目標は、Windowsコンパクト2013上で実行されている、32ビットおよびUnicodeである]

答えて

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

このチェックの制限は、それが容易に同じインターフェイス上の複数の接続をサポートしていないということです、このクエリは、私たちは、ステータスが参照する接続のどの照会することはできません。

もっと良い解決策が見つかったら、ここで報告します。