VC++实现启用与停用设备

通过API实现C#对硬件的控制(二) 通过上一篇“通过API实现C#对硬件的控制(一)” 我们掌握了我们所需要的相关API知识点。为此,我们现在来构建我们自己的外部调用类:Externs。由于有上一篇的详细说明,该处不再一一说明相关的函数知识点。下面是该类的代码:using System;using System.Collections.Generic;using System.Text;using System.Runt 阅读详情

前些日子在研究USB设备,就顺便研究了一些如何在应用程序实现USB设备的启用与停用,然后稍微深入,于是有了本文。

想要实现类似设备管理器的功能,其实也不是很难,无非就是调用一些API函数,就像本文描述的,采用的API函数就是SetupDi系列的函数。不过这类函数有很多,具体的请参见MSDN,而实现设备启用、停用仅需要用到的就只有5个函数:
       SetupDiGetClassDevs                   // 获取设备信息集
       SetupDiEnumDeviceInfo                 // 从设备信息集中枚举每个设备的具体信息
       SetupDiGetDeviceRegistryProperty      // 从注册表中读取PnP设备的属性
       SetupDiSetClassInstallParams          // 设置(包括取消)设备类的安装参数
       SetupDiCallClassInstaller             // 安装指定设备
以上函数均在setupapi.h头文件中声明,该头文件包含在setupapi.lib函数库中(使用以上函数前需要声明这个头文件)。

接下来就是如何实现设备的启用与停用。
从原理上讲,设备的启用与停用其实就是对该设备进行重安装。

首先,我们需要声明两个变量用来保存指定设备类的属性信息:
    HDEVINFO        m_hDevInfo;              // 类似设备句柄,以下暂且称为设备句柄
    SP_DEVINFO_DATA m_DeviceInfoData;        // 设备详细属性信息

然后调用SetupDiGetClassDevs函数获取设备句柄的值。(在这个函数中,需要指定设备类的GUID,如果不清楚这个GUID,可以在相应的安装文件.inf中查找。注意:是设备类的GUID,不是设备的GUID!)

接着循环使用SetupDiEnumDeviceInfo函数枚举对应设备类中的设备,并使用SetupDiGetDeviceRegistryProperty函数获取得到的设备的详细信息,进行判断是否为所需的设备(判断的方式有多种,具体参考MSDN,本文采用设备描述进行判断)。
一旦枚举结束(即枚举不成功,而且用GetLastError()可以得到错误码259)即可退出循环。当然如果找到设备,即可break退出。

如果找到对应的设备,就调用SetupDiSetClassInstallParams函数设置安装的属性。这里有个注意的地方需要详细说明一下:
SetupDiSetClassInstallParams的函数原型如下:
WINSETUPAPI BOOL WINAPI
  SetupDiSetClassInstallParams(
    IN HDEVINFO  DeviceInfoSet,
    IN PSP_DEVINFO_DATA  DeviceInfoData,  OPTIONAL
    IN PSP_CLASSINSTALL_HEADER  ClassInstallParams,  OPTIONAL
    IN DWORD  ClassInstallParamsSize
    );
注意第三个参数PSP_CLASSINSTALL_HEADER  ClassInstallParams,
这里我们不采用这个结构,而是采用另外一个结构:SP_PROPCHANGE_PARAMS
并在这个结构中,
设置ClassInstallHeader字段中(我们发现这个字段也是一个结构,就是PSP_CLASSINSTALL_HEADER结构)的InstallFunction字段值为DIF_PROPERTYCHANGE,
设置StateChange值为DICS_ENABLE(该值为启用,若是停用则为DICS_DISABLE)
然后采用强行转换将其转为PSP_CLASSINSTALL_HEADER结构。

最后,调用SetupDiCallClassInstaller函数执行设备的安装(即:启用或者停用),注意该函数第一个参数值应为DIF_PROPERTYCHANGE。
从设备管理器中,可以验证我们的做法。

以下贴出我程序中的主要源码。

  BOOL               rlt            = FALSE;
  CString            csFriendlyName = myDevcieName;                           // 请修改该值
  GUID               devGUID        = {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}; // 这个值不用我再说了吧?!
  HDEVINFO           m_hDevInfo     = INVALID_HANDLE_VALUE;
  SP_DEVINFO_DATA    m_DeviceInfoData;

  RtlZeroMemory(&m_DeviceInfoData, sizeof(SP_DEVINFO_DATA));                  // 初始化m_DeviceInfoData,当然这只是范例,
  m_DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);                          // 有其他初始化的方法,大家见仁见智

  m_hDevInfo = SetupDiGetClassDevs(&devGUID,0,0,DIGCF_PRESENT );
 
  for (DWORD i = 0; SetupDiEnumDeviceInfo ( m_hDevInfo, i, &m_DeviceInfoData ); i++ )
  {
         DWORD DataT;
         LPTSTR buffer  = NULL;
         DWORD buffersize = 0;
        
         while ( !SetupDiGetDeviceRegistryProperty
              (
                   m_hDevInfo,
                   &m_DeviceInfoData,
                   SPDRP_DEVICEDESC,
                   &DataT,
                   (PBYTE)buffer,
                   buffersize,
                   &buffersize
         ) )
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                 // Change the buffer size.
                 if (buffer) 
                 {
                       LocalFree(buffer);
                 }
                 buffer = (char*)LocalAlloc(LPTR,buffersize);
            }
            else
            {
                 break;
            }
        }

        if ( ( buffer != NULL ) && ( csFriendlyName.Find ( buffer, 0 ) != ( -1 ) ) )
        {
            if (buffer) 
            {
                 LocalFree(buffer);
            }
            break;
        }
                
        if (buffer) 
        {
            LocalFree(buffer);
        }
  }

  SP_PROPCHANGE_PARAMS propChange = { sizeof ( SP_CLASSINSTALL_HEADER ) };
  propChange.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
  propChange.Scope = DICS_FLAG_GLOBAL;
  propChange.StateChange = DICS_ENABLE;   // 启用,或是停用,请使用DICS_DISABLE

  if (m_DeviceInfoData.DevInst != NULL)
  {
        rlt = SetupDiSetClassInstallParams
        (      
                m_hDevInfo, 
                &m_DeviceInfoData, 
                ( SP_CLASSINSTALL_HEADER * ) &propChange, 
                sizeof ( propChange ) 
        );
  }

  if ( rlt )
  {
        rlt = SetupDiCallClassInstaller ( DIF_PROPERTYCHANGE, m_hDevInfo, &m_DeviceInfoData );
  }

AutoCAD卸载残留彻底清理指南:手动删除注册表与文件 软件卸载残留是Windows系统管理中常见的技术问题,其核心原理在于应用程序在安装时不仅部署了程序文件,还会在注册表和多个系统目录写入大量配置信息、路径关联和许可数据。标准卸载流程往往无法彻底清除这些深层痕迹,导致重新安装失败、软件冲突或运行异常。从技术价值看,理解并掌握手动清理方法,能实现对系统状态的精准控制,有效解决因残留导致的复杂兼容性问题,提升系统稳定性。在工程实践场景中,对于AutoCAD这类大型专业软件,当遇到安装错误、许可冲突或版本升级障碍时,遵循系统化的手动清理流程(包括注册表编辑、文件系统 阅读详情

相关推荐

西门子博途TIA Portal V20安装全流程详解:避坑指南与许可证激活实战

TIA Portal是西门子全集成自动化(TIA)的核心工程平台,其安装并非普通软件部署,而是涉及操作系统兼容性、运行时环境(.NET Framework、VC++ Redistributable)、许可证管理机制(Automation License Manager)及Windows底层服务协同的系统性工程。理解其依赖原理——如ALM服务与硬件ID绑定、浮动/节点锁定授权差异、仿真依赖Hyper-V虚拟化——是保障STEP 7 Professional和WinCC Advanced等模块稳定运行的技术前提

weixin_33895516的博客 1078

windows api 控制启用/停用网卡

通过设备名启用/停用网卡,我用来控制系统中的虚拟网卡的,使用的是windows的 setupapi ,测试程序使用QT编写

Lumion 8.0硬件兼容性与安装排错全指南

Lumion 8.0并非普通渲染软件,而是一款深度依赖DirectX 11.1 Feature Level 11_0和GPU硬加速的实时渲染引擎。其运行原理绕过CPU并压榨显卡算力,对NVIDIA/AMD显卡型号、驱动版本、PCIe带宽、系统组件(如.NET 4.6.2、VC++2015运行库)均有严苛要求。技术价值在于提供建筑可视化级的交互式渲染体验,但前提是完成硬件可信度验证与底层系统校准。典型应用场景包括高校建筑教学、中小型设计院旧项目维护及RTX前时代工作站部署。本文聚焦Lumion 8.0的硬件兼

weixin_33911824的博客 466

用SetupDi* 启用/禁用网卡

#include <windows.h> #include <tchar.h> #include <stdio.h> #include <SetupAPI.h> #include <cfgmgr32.h> // cfgmgr32.h 在Microsoft Windows 2000 DDK 中. #pragma comment(lib...

MA540213的专栏 1851

wpcap.dll缺失真相:WinPcap停更后的驱动兼容性解决方案

wpcap.dll缺失并非简单文件丢失,而是WinPcap这一基于NPF内核驱动的旧有抓包框架,在Windows 10/11签名强制策略下彻底失效的技术现象。其核心原理在于微软自Windows 8.1起要求内核驱动必须WHQL签名,而WinPcap 4.1.3的NPF.sys从未适配新认证体系,导致系统静默拒绝加载。该问题广泛影响eNSP、VirtualBox 5.2、Vivado SDK等依赖PCAP接口的工程工具,技术价值在于推动用户从过时驱动模型转向Npcap等现代WFP架构替代方案。典型应用场景包括

weixin_34166847的博客 308

ArcGIS Desktop 10.8.2 安装与稳定运行全指南

ArcGIS Desktop 是 Esri 推出的经典桌面地理信息系统平台,其核心组件 ArcMap 和脚本引擎 ArcPy 构成 GIS 数据处理、空间分析与自动化工作的基础环境。该软件基于 COM 架构与 Python 2.7 深度集成,强调在 Windows 系统下的兼容性、许可稳定性及生产级鲁棒性。技术价值体现在对 Shapefile、Geodatabase、CAD、栅格影像等多源数据的开箱即用支持,以及 ModelBuilder 与 ArcPy 联动实现的工程化批量处理能力。典型应用场景涵盖国土调

weixin_33850015的博客 331

SetupDiCallClassInstaller处理流程

MS将于今年10月推出win10 RS3 RTM版,并要求OEM厂商的驱动程序必须支持新的D/C/H/U驱动框架(微软爸爸一声令下,苦了我们)。其中的"C"项要求过滤驱动的inf文件必须以扩展INF(Extension inf的概念在Win10上首次提出)的方式安装。经过一番痛苦的摸索,终于把公司大部分的过滤驱动的inf文件转为扩展INF。你以为我会写怎么支持DCHU?呵呵,参考今年WinHEC的

lixiangminghate的专栏 5018

老旧电脑Arduino IDE下载兼容性问题深度剖析

面对老旧电脑运行缓慢、系统版本低等现实问题,Arduino IDE下载常遭遇兼容性报错或安装失败。本文从系统要求、替代下载渠道、轻量版IDE推荐三方面入手,手把手教你绕过障碍完成arduino ide下载,特别适配Windows 7及32位老机型。

weixin_35886636的博客 294

停用及启用磁盘设备、修改盘符代码

void ResetHDState(bool bEnable){    GUID guid = DiskClassGuid;    HDEVINFO hDevinfo = SetupDiGetClassDevs(&guid, NULL, NULL, /*DIGCF_PRESENT*/DIGCF_DEVICEINTERFACE);    SP_DEVINFO_DATA spDev

gavin1203的专栏 950

Project 2024合法安装与企业级部署全指南

Microsoft Project 是面向项目管理的专业级桌面应用,其安装本质是与Windows系统、Office运行时及.NET框架深度协同的系统级配置过程。理解Project安装原理,关键在于掌握Click-to-Run架构、MSI静默部署机制与许可证验证逻辑。技术价值体现在稳定性保障、批量可审计性与合规风险规避——避免因盗版包引发的DLL劫持、挖矿模块植入或甘特图数据丢失。典型应用场景包括央企EPC项目部批量部署、科技公司远程办公环境配置,以及混合云企业通过Azure AD实现自动激活。本文聚焦Pro

chupu2979的博客 370

卫士通SJJ1632-B加密装置管理软件:核心功能、部署与运维实战指南

在数据安全领域,硬件加密装置是保障核心数据机密性与完整性的关键基础设施。其工作原理是通过专用加密芯片和固件,在硬件层面实现数据的加解密、密钥管理等密码学运算,从而提供远超软件加密的安全性与性能。这类技术的核心价值在于满足金融、政务等高安全等级场景下的合规要求,并确保业务数据的端到端安全。在实际应用中,管理员需要通过专用的管理软件对加密装置进行全生命周期管控,这涉及到**密钥管理**、策略配置、状态监控等核心任务。以卫士通SJJ1632-B管理软件为例,它作为连接管理员与硬件设备的桥梁,其部署与运维过程涵盖了

weixin_33695082的博客 279

免费Windows按键映射工具QKeyMapper怎么用:一次搞定游戏键位自定义与办公快捷键优化

如果你曾为按键布局感到别扭,QKeyMapper这款开源按键映射工具值得一试。它是用Qt开发的Windows工具,支持Win10和Win11,能实现键盘、鼠标、物理手柄、虚拟手柄之间任意互相映射,无需安装、不动注册表,点一下按钮映射立即生效,再点一下立即停止,全程不用重启系统。接下来,我带你从零上手这款备受好评的改键工具。 ## 深夜两点,你的角色停在原地 想象这样一个晚上:你卡在一个高难Bo

gitblog_00293的博客 177

插件与读屏软件安装配置全指南:从安全安装到高效管理

插件作为扩展软件功能的核心模块,其原理是通过注入代码或资源来增强宿主应用的能力,从而提升工作效率和用户体验。从技术价值看,合理使用插件能实现自动化、定制化,是开发者和高级用户优化工作流的关键。在应用场景上,无论是浏览器广告拦截、IDE代码补全,还是设计工具的效率提升,都离不开插件的支持。然而,插件的安装与管理常伴随安全风险与兼容性问题,例如来源混乱可能导致恶意软件入侵,权限过度则引发隐私泄露。同样,读屏软件作为重要的辅助技术,其系统集成度高,配置复杂,涉及语音合成与屏幕内容解析。本文聚焦于**插件安全安装*

weixin_33913332的博客 396

如何用CefFlashBrowser完美解决Flash内容浏览难题:终极Flash浏览器指南

还在为无法播放网页Flash内容而烦恼吗?CefFlashBrowser是一款自带Flash Player插件的浏览器,专为解决Flash内容显示问题而生。它不仅能够正常显示网页上的Flash动画、游戏和应用程序,还支持打开本地SWF文件,并提供强大的Flash游戏存档管理功能,让你重温经典Flash时代的完整体验。 ## 项目核心亮点:为什么要选择CefFlashBrowser? 1. **

gitblog_01191的博客 677

修复禁用设备的方法——Windows设备恢复编程指南

综上所述,以上是一种修复在Windows中设备禁用的编程方法。通过检测设备状态并启用禁用的设备,我们可以确保设备在Windows操作系统中正常工作。本文将介绍一种编程方法,帮助您恢复被禁用的设备,并确保其正常运行。首先,我们需要检测设备是否被禁用。通过Windows的设备管理器可以获取设备的状态信息。这些函数将为设备发送安装参数和命令,以便将其状态更改为启用。一旦我们检测到禁用的设备,我们可以使用Windows API函数。函数,我们可以启用设备并更改其状态为启用。来获取设备列表,并逐个检查设备的状态。

DevGOOD的博客 379

TIA博途V20安装教程:解决.NET Framework 3.5缺失与安装失败问题

在工业自动化领域,PLC编程与组态软件是工程师不可或缺的工具,而西门子TIA Portal正是其中的核心平台。TIA博途V20作为新一代集成环境,将PLC编程、WinCC组态和驱动调试融为一体,但许多工程师在安装时却频繁遇到系统环境问题,尤其是.NET Framework 3.5缺失导致的安装失败或回滚。从技术原理来看,TIA Portal的底层服务依赖.NET 3.5运行时,而Windows 10/11默认并未启用该功能,这成为安装翻车的主要根因。掌握DISM离线启用、系统组件预检和安装日志分析等基础技能

weixin_34138056的博客 307

Windows 11下EPLAN安装实战:驱动签名、许可服务与静默部署

EPLAN作为工业电气设计核心软件,其在Windows 11环境下的部署本质是系统级兼容性工程。由于Win11强化内核签名验证、加密服务依赖及UAC虚拟化机制,传统安装流程极易触发驱动数字签名报错、writesettings failed、许可错误210092等典型故障。解决路径需从操作系统底层切入:禁用测试签名模式以兼容CH340/ST-Link等工业驱动,重置Cryptographic Services保障安装包校验,配置专用管理员账户规避注册表重定向,并精准匹配.NET 4.8.1与VC++ 14.3

weixin_32325225的博客 478

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 291
上一篇: 乔布斯:影响我一生的三个故事
下一篇: CIF,4CIF,QCIF,D1
jiangdf
博客等级 码龄19年 86粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值