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

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

Index设为0.
State设置如下:


typedef enum _DOT11_RADIO_STATE { 
 dot11_radio_state_unknown, 
 dot11_radio_state_on, 
 dot11_radio_state_off 
} DOT11_RADIO_STATE, *PDOT11_RADIO_STATE; 

与前几个API(比如wlanconnect)相比,这个函数的使用简单多了。全部源码如下:


// 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); 
  return false; 
 } 
  
 WLAN_PHY_RADIO_STATE state; 
 state.dwPhyIndex = 0; 
 state.dot11SoftwareRadioState = dot11_radio_state_on; 
 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); 
 } 
 
 return 0; 
} 

8.GOTO在释放资源时的作用
GOTO语句有着很臭的名声,我们的老师经常教导我们说,不要轻易使用它。
C++跳转语句有三个:goto、break和continue。它们只是工具,我觉得问题不能归咎于工具,问题在于人。
就像指针一样,goto这个无条件跳转语句力量还是很强大的,如果滥用,出现问题很难排查。
但有些时候goto确实是不二选择,例如我遇到的,在函数中有多个出口,而每个出口都遇到释放资源的时候,与其都把释放语句不厌其烦的写一遍,
不如一个goto语句来的干脆利落。
下面的例子取自上一篇Native Wifi API文章,由于我们的程序经常控制的wifi的on和off,必须注意释放资源。就拿WlanOpenHandle来说,
如果不注意对称WlanCloseHandler,程序几次运行后报错:ERROR_REMOTE_SESSION_LIMIT_EXCEEDED
官网解释为:Too many handles have been issued by the server.
所以我们会在每个API调用后,确认返回值,如果错误,程序将不再继续向下运行,return之前,我们必须释放资源。当出口很多时,我们要写很多同样的代码,