在C++程序中开启和禁用Windows设备的无线网卡的方法_C 语言

1.列出当前网卡:SetupDiEnumDeviceInfo
2.找出当前无线网卡的名字(用natvie wifi api)
3.卸载\安装此驱动
问题:
log为:SetupDiSetClassInstallParams failed. -536870347
 
完整代码如下:

// ControlWirelessCard.cpp : Defines the entry point for the console application.
// 

#include "stdafx.h"
#include <windows.h>
#include <SetupAPI.h>
#include <devguid.h>
#include <string>
#include <cfgmgr32.h>
#include <wlanapi.h>
#pragma comment(lib,"setupapi.lib")
#pragma comment(lib, "wlanapi.lib")
using namespace std; 

wstring getWirelessNetworkCardName()
{
  wstring wirelessName;
  HANDLE hClient = NULL;
  DWORD dwMaxClient = 2;   //
  DWORD dwCurVersion = 0;
  DWORD dwResult = 0;
  DWORD dwRetVal = 0;
  int iRet = 0;
  WCHAR GuidString[39] = {0};
  unsigned int i; 

  /* variables used for WlanEnumInterfaces */
  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: %u\n", dwResult);
    return wirelessName;
  } 

  dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
  if (dwResult != ERROR_SUCCESS) {
    wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
    return wirelessName;
  } else {
    PWLAN_AVAILABLE_NETWORK_LIST pWLAN_AVAILABLE_NETWORK_LIST = NULL;
    dwResult = WlanGetAvailableNetworkList(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,
        WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,
        NULL, &pWLAN_AVAILABLE_NETWORK_LIST);
    if (dwResult != ERROR_SUCCESS)
    {
      printf("WlanGetAvailableNetworkList failed with error: %u\n",dwResult);
      WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);
      return wirelessName;
    }     

    for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) {
      pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];
      iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString,
        sizeof(GuidString)/sizeof(*GuidString));  

      wirelessName = pIfInfo->strInterfaceDescription;
    }
  }
  return wirelessName;
} 

BOOL changeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)
{
  LPTSTR lpszMsg = NULL;
  HCURSOR hCursor = NULL;
  try
  {
    SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};  

    hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
    // Get a handle to the Selected Item.
    if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
    {
      wprintf(L"SetupDiEnumDeviceInfo failed. %d\n",GetLastError());
      throw lpszMsg;
    } 

    // Set the PropChangeParams structure.
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    PropChangeParams.Scope = DICS_FLAG_GLOBAL;
    PropChangeParams.StateChange = NewStatus; 

    if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
    sizeof(PropChangeParams)))
    {
      wprintf(L"SetupDiSetClassInstallParams failed. %d\n",GetLastError());
      throw lpszMsg;
    }
    // Call the ClassInstaller and perform the change.
    if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))
    {
      wprintf(L"SetupDiCallClassInstaller failed. %d\n",GetLastError());
      throw lpszMsg;
    }
    SetCursor(hCursor);
    return TRUE;
  }
  catch (TCHAR * pszError)
  {
    SetCursor(hCursor);
    if (NULL != lpszMsg)
    {
      LocalFree((HLOCAL)lpszMsg);
    }
    return FALSE;
  }
} 

int _tmain(int argc, _TCHAR* argv[])
{
  LPTSTR lpszMsg = NULL;
   try
   {
     /*
     TCHAR * GUIDString = NULL;
     GUID guid;
     ZeroMemory(&guid, sizeof(GUID));
     GUIDString = _T("4d36e972-e325-11ce-bfc1-08002be10318");
     UuidFromString((unsigned char *)GUIDString, &guid);
     */
     //GUID guid = getWirelessNetworkCardGUID();
     HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET,/*L"WIRELESS"*/NULL,NULL,DIGCF_PRESENT);
     //HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid,/*L"WIRELESS"*/NULL,NULL,DIGCF_PRESENT);
     if (INVALID_HANDLE_VALUE == hDevInfo)
     {
      wprintf(L"INVALID_HANDLE_VALUE");
      return -1;
     } 

     DWORD i;
     int Icount=0;
     SP_DEVINFO_DATA DeviceInfoData;
     ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 

     for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
     {
       //Get DeviceInfo
       LPTSTR buffer = NULL;
       DWORD buffersize = 0;
       DWORD Status, Problem;
       BOOL bDisabled = FALSE;
      while (!SetupDiGetDeviceRegistryProperty(
          hDevInfo,
          &DeviceInfoData,
          SPDRP_DEVICEDESC, //Read the names of the designated card
          NULL,
          (PBYTE) buffer,
          buffersize,
          &buffersize)
        )
       {
         if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
         {
           if (buffer) LocalFree(buffer);
          buffer=(LPTSTR)LocalAlloc(LPTR,buffersize);
         }
         else
         {
          wprintf(L"read network card failed!");
         }
       } 

       std::wstring strEthernet = buffer;
       //wprintf(L"the buffer is %ws\n",buffer); 

       wstring wirelessName = getWirelessNetworkCardName();
       if(wirelessName.empty())
       {
         wprintf(L"wirelessName IS empty\n");
         return -1;
       }
       //wprintf(L"wirelessName is %ws\n",wirelessName); 

       if(wirelessName == buffer)
       {
         wprintf(L"Found the wireless card: %ws\n",wirelessName);
         if (int i= CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0) != CR_SUCCESS)
         {
           wprintf(L"CM_Get_DevNode_Status failed. %d\n",GetLastError());
          throw "failed\n";
         }
         if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)))
         {
           bDisabled = FALSE;
         }
         if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))
         {
           bDisabled = TRUE;
         }
         if(bDisabled==FALSE)
         {
           wprintf(L"disable the network card\n");
           changeStatus(DICS_DISABLE, i, hDevInfo);//disable
         }
         if(bDisabled==TRUE)
         {
           wprintf(L"enable the network card\n");
           changeStatus(DICS_ENABLE, i, hDevInfo);// enable
         }
       }
     }
     return SetupDiDestroyDeviceInfoList(hDevInfo);
   }
   catch (TCHAR * pszError)
   {
     if (NULL != lpszMsg)
     {
      LocalFree((HLOCAL)lpszMsg);
     }
    return FALSE;
   }
  return 0;
}

一些常见错误解决
一、
从错误返回值入手。
-536870347,用windows自带计算器,选择程序员模式,将此十进制转换为16进制为E0000235.
用此错误号搜索,就是大名鼎鼎的32位程序跑在64位系统中报错。
虽然我用的64位win8下VS编译的程序,但是编译选项中仍然是WIN32程序。那么我们只需要修改成x64编译即可,操作如下。
BUILD-->Configuration Manager...-->找到要修改的project,将platform选择为x64.
如果没有,说明没有添加x64编译项,接着上面,在platform中选择<New...> -->New platform下选x64-->OK.
二、
编译64位程序,运行之。
仍然报错,返回值是5.ACCESS_DENIED.
权限不够,我们需要申请高权限。如下申请Admin权限:
你项目的Properties-->Linker-->Manifest File-->UAC Execution Level选requireAdministrator。
三、
继续运行。卸载无线网卡驱动成功。
但是上一篇的程序仍然有个问题,由于驱动卸载了,就不能用wlan api得到无线网卡名称,
所以程序加载无线网卡驱动就会失败。
我们可以用关键字“Wireless Network Adapter”来查找无线网卡,省掉使用wlan api那一步。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, windows
无线网卡
易语言禁用网卡、无线网卡禁用如何开启、usb网卡反复禁用开启、windows 禁用网卡命令、windows 禁用网卡,以便于您获取更多的相关知识。

时间: 2024-09-21 15:59:23

在C++程序中开启和禁用Windows设备的无线网卡的方法_C 语言的相关文章

MFC中动态创建控件以及事件响应实现方法_C 语言

本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()

用C# 控制Windows系统音量的实现方法_C 语言

C#开发Windows应用程序中经常需要去控制系统的音量,分两种方式: 1.使用Win Api控制 2.使用C++ dll控制 Win Api控制: 使用user32.dll和winmm.dll都可以控制系统音量,区别是Win系统的版本.winmm.dll Xp环境下可用,user32.dll Vista及以上版本. C++ dll控制: CoreAudioApi 是C++ 第三方封装了音量控制,网上下载DLL后再项目中引用即可使用.CoreAudioApi Vista及以上版本支持. 下面给出

VC实现Windows多显示器编程的方法_C 语言

本文实例讲述了VC实现Windows多显示器编程的方法.分享给大家供大家参考.具体如下: 一.Windows中接入多个显示器时,可设置为复制和扩展屏. 1.设置为复制屏幕时,多个显示器的分辨率是一样的,位置为0~分辨率值 2.设置为扩展屏幕时,显示器之间的关系比较复杂些.首先Windows系统会识别一个主显示器,这个可以在屏幕分辨率中更改.多个显示器之间的位置关系也可以再屏幕分辨率中更改.其中主显示器的位置为(0,0)到(width,height),其他显示器位置由与主显示器的位置关系决定,在主

C++实现将一个字符串中的字符替换成另一个字符串的方法_C 语言

本文实例讲述了C++实现将一个字符串中的字符替换成另一个字符串的方法,分享给大家供大家参考.具体方法如下: 题目要求: 原地实现字符串中的每个空格替换成"%20",例如输入"We are happy", 输出"We%20are%20happy" 被替换的字符串当然不仅仅是空格,上面只是个例子 这是道很好的题目,也是百度面试中的一道题,题目不难,但是问题得考虑全面.这里给出如下实现代码: #include <iostream> #inc

讲解C++中的枚举类型以及声明新类型的方法_C 语言

C++枚举类型如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型.所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内.声明枚举类型用enum开头.例如: enum weekday{sun, mon, tue, wed, thu, fri, sat}; 上面声明了一个枚举类型weekday,花括号中sun, mon, -, sat等称为枚举元素或枚举常量.表示这个类型的变量的值只能是以上7个值之一.它们是用户自己定义的标识符. 声明枚举类型

C中实现矩阵乘法的一种高效的方法_C 语言

如何计算矩阵乘法,这个大家都知道.通常情况下,我们都是用以下代码实现的: 复制代码 代码如下: for(i=0;i<n;++i)    for(j=0;j<n;++j){        sum=0;        for(k=0;k<n;++k)            sum+=A[i][k]*B[k][j];        C[i][j]+=sum;} 但是考虑了高速缓存的问题后,其实有一种更好的实现方式: 复制代码 代码如下: for(i=0;i<n;++i)    for(k

C++中的多态与虚函数的内部实现方法_C 语言

1.什么是多态 多态性可以简单概括为"一个接口,多种行为". 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可以用自己的方式去响应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数.这是一种泛型技术,即用相同的代码实现不同的动作.这体现了面向对象编程的优越性. 多态分为两种: (1)编译时多态:主要通过函数的重载和模板来实现. (2)运行时多态:主要通过虚函数来实现. 2.几个相关概念 (1)覆盖.

C语言中等待socket连接和对socket定位的方法_C 语言

C语言listen()函数:等待连接头文件: #include <sys/socket.h> 定义函数: int listen(int s, int backlog); 函数说明:listen()用来等待参数s 的socket 连线. 参数backlog 指定同时能处理的最大连接要求, 如果连接数目达此上限则client 端将收到ECONNREFUSED 的错误. Listen()并未开始接收连线, 只是设置socket 为listen 模式, 真正接收client 端连线的是accept()

c++中的消息框messagebox()详细介绍及使用方法_C 语言

1.MessageBox("这是一个最简单的消息框!"); 2.MessageBox("这是一个有标题的消息框!","标题"); 3.MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL ); 4.MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION ); 5.MessageBox(&