C++程序中使用Windows系统Native Wifi API的基本教程

2020-01-06 14:45:31丽君

很烦躁,难读,代码急速膨胀。但使用goto后,问题便轻松了许多,请看简单例子:


// ManageWirelessNetwork.cpp : Defines the entry point for the console application. 
// 
 
#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 
#include <shellapi.h> 
#include <wlanapi.h> 
 
// Need to link with shell32.lib 
#pragma comment(lib, "shell32.lib") 
#pragma comment(lib, "wlanapi.lib") 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  DWORD dwResult = 0; 
  DWORD dwMaxClient = 2; 
  DWORD dwCurVersion = 0; 
  HANDLE hClient = NULL; 
  PWLAN_INTERFACE_INFO_LIST pIfList = NULL; 
  PWLAN_INTERFACE_INFO pIfInfo = NULL; 
 
  dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient); 
  if (dwResult != ERROR_SUCCESS) { 
    wprintf(L"WlanOpenHandle failed with error: %un", dwResult); 
    return false; 
  } 
 
  dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList); 
  if (dwResult != ERROR_SUCCESS) { 
    wprintf(L"WlanEnumInterfaces failed with error: %un", dwResult); 
    goto RELEASE_RESOURCE; 
  } 
   
  WLAN_PHY_RADIO_STATE state; 
  state.dwPhyIndex = 0; 
  state.dot11SoftwareRadioState = dot11_radio_state_on;//off here too. 
  PVOID pData = &state; 
 
  dwResult = WlanSetInterface(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid, 
    wlan_intf_opcode_radio_state,sizeof(WLAN_PHY_RADIO_STATE),pData,NULL); 
 
  if(dwResult == ERROR_SUCCESS) 
  { 
    wprintf(L"set state success!n"); 
  } 
  else 
  { 
    wprintf(L"set state failed!err is %dn",dwResult); 
  } 
RELEASE_RESOURCE: 
  if(hClient) 
  { 
    WlanCloseHandle(hClient,NULL); 
    hClient = NULL; 
  } 
  if(pIfList) 
  { 
    WlanFreeMemory(pIfList); 
    pIfList = NULL; 
  } 
  if(pIfInfo) 
  { 
    WlanFreeMemory(pIfInfo); 
    pIfInfo = NULL; 
  } 
  return 0; 
} 

最后,goto还会用来跳出多重循环。但需要注意的是,只能从内层跳到外层,不可逆操作。

 

后记:
其实几个月前就要实现windows上的wifi on和off,问了许多人,发了许多帖子,最后都不了了之。之后的日子里也发生了许多事。国内的
搜索无果,加上google的无法使用,都对调查增加了些许难度。我们把重点先放到了native wifi api的几个方法,见上一篇玩转文章。但
那并不是我想要的。
原以为windows也会想android一样,普通应用没有权限来控制wifi的开关呢,结果并不是这样。这也宣告了之前我的判断失误。
直到今天,通过Bing发现了几条线索。那是通过C#调用native wifi api的问题,里面提及了之前并没有重视的wlansetinterface。
Interface,在这里我觉得可以理解成无线网卡。类似的WlanEnumInterfaces中实现的功能是罗列出当前无线网卡。