首页 > 系统相关 >Windows下获取设备管理器列表信息-setupAPI

Windows下获取设备管理器列表信息-setupAPI

时间:2023-12-12 23:22:58浏览次数:36  
标签:管理器 Windows out 信息 DWORD NULL optional setupAPI 设备

背景及问题:

在与硬件打交道时,经常需要知道当前设备连接的硬件信息,以便连接正确的硬件,比如串口通讯查询连接的硬件及端口,一般手工的方式就是去设备管理器查看相应的信息,应用程序如何读取这一部分信息呢,Windows下的SetupAPI系列就可以解决这个问题

示例程序

#include<Windows.h>
#include<SetupAPI.h>
#include<iostream>
#include<string>
#pragma comment(lib, "setupapi.lib")

int main()
{
	//set chinese character
	std::locale::global(std::locale(""));

	//The SetupDiGetClassDevs function returns a handle to a device 
    //information set that contains requested device information 
    //elements for a local computer.
	HDEVINFO hdevinfo = SetupDiGetClassDevs(NULL,
		NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
	if (hdevinfo != INVALID_HANDLE_VALUE)
	{
		DWORD MemberIndex = 0;
		SP_DEVINFO_DATA sp_devinfo_data;
		ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
		sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);

        //The SetupDiEnumDeviceInfo function returns a SP_DEVINFO_DATA 
        //structure that specifies a device information element in a 
        //device information set.
		while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data))
		{
			TCHAR PropertyBuffer[100];

        	//The SetupDiGetDeviceRegistryProperty function retrieves
			//a specified Plug and Play device property.    
			if (SetupDiGetDeviceRegistryProperty(hdevinfo,
				&sp_devinfo_data,
				SPDRP_DEVICEDESC,
				NULL,
				(PBYTE)&PropertyBuffer,
				sizeof(PropertyBuffer),
				NULL))
			{

				std::wcout << MemberIndex << ":" << (wchar_t*)PropertyBuffer << std::endl;

			}
			MemberIndex++;

		}

	}
	return 0;
}

解释

主要是3个API的使用
  1. SetupDiGetClassDevs -->获取设备信息的集合
  2. SetupDiEnumDeviceInfo -->针对具体的设备解析信息
  3. SetupDiGetDeviceRegistryProperty -->提取具体设备的感兴趣信息

其中SetupDiGetClassDevs定义如下

WINSETUPAPI HDEVINFO SetupDiGetClassDevsW(
  [in, optional] const GUID *ClassGuid,
  [in, optional] PCWSTR     Enumerator,
  [in, optional] HWND       hwndParent,
  [in]           DWORD      Flags
);
Parameter Description
[in, optional]const GUID *ClassGuid 指向设备设置类或设备接口GUID的指针。可为NULL(可选)
[in, optional] PCWSTR Enumerator 指定设备种类。可为NULL(可选)
[in, optional] HWND hwndParent 显示设备信息UI界面窗口句柄。可为NULL(可选)
[in, optional] DWORD Flags 过滤设备信息标志位
返回值HDEVINFO 返回设备信息的集合
程序中前三个均设置为NULL,第四个标志位设为DIGCF_PRESENT|DIGCF_ALLCLASSES,表示当前系统已安装的所有设备,还有一些标志参见

MSDN页面-SetupDiGetClassDevsW

拿到设备信息集合之后,使用SetupDiEnumDeviceInfo进行单个设备信息的解析

WINSETUPAPI BOOL SetupDiEnumDeviceInfo(
  [in]  HDEVINFO         DeviceInfoSet,
  [in]  DWORD            MemberIndex,
  [out] PSP_DEVINFO_DATA DeviceInfoData
);
Parameter Description
[in] HDEVINFO DeviceInfoSet 设备信息集合句柄
[in] DWORD MemberIndex 集合中第几个设备
[out] PSP_DEVINFO_DATA DeviceInfoData 具体的设备信息数据
拿到单个设备的信息之后(仍包含很多信息),使用SetupDiGetDeviceRegistryProperty对感兴趣的信息解析
WINSETUPAPI BOOL SetupDiGetDeviceRegistryPropertyW(
  [in]            HDEVINFO         DeviceInfoSet,
  [in]            PSP_DEVINFO_DATA DeviceInfoData,
  [in]            DWORD            Property,
  [out, optional] PDWORD           PropertyRegDataType,
  [out, optional] PBYTE            PropertyBuffer,
  [in]            DWORD            PropertyBufferSize,
  [out, optional] PDWORD           RequiredSize
);
Parameter Description
[in] HDEVINFO 设备信息集合句柄
[in] PSP_DEVINFO_DATA DeviceInfoData 具体的设备信息数据
[in] DWORD Property 设备属性
[out, optional] PDWORD PropertyRegDataType 指向接收所检索属性的数据类型变量的指针。可为NULL(可选)
[out, optional] PBYTE PropertyBuffer 指向接收正在检索的属性的缓冲区的指针
[in] DWORD PropertyBufferSize 缓冲区大小
[out, optional] PDWORD RequiredSize 缓冲区的所需大小。可为NULL(可选)
程序中设备属性设置为SPDRP_DEVICEDESC,查询的是设备名的描述,还有很多属性参见

MSDN页面-SetupDiGetDeviceRegistryPropertyW

需要注意的是

  • windows API 通常分单双字节版本,单字节版本一般调用A结尾的API,对应的VS项目属性中字符集为Multi-Byte,双字节版本一般调用以w结尾的API,对应VS项目属性中字符集为Unicode。本例项目属性为Unicode,对应双字节字符串版本,所以输出信息以wcout输出,缓冲区指针转换为wchar_t*
  • TCHAR为自动根据项目中字符集属性转为char(Multi-Byte)或wchar(Unicode)

标签:管理器,Windows,out,信息,DWORD,NULL,optional,setupAPI,设备
From: https://www.cnblogs.com/stephen2023/p/17898051.html

相关文章

  • Windows10开启NTP服务端,给局域网设备授时
    Windows10开启NTP服务端,给局域网设备授时2023年12月12日22:04周二要实现通过NTP协议给操作站给同局域网内其他设备授时,统一时间配置注册表将以下文本复制到记事本中文件后缀名为reg,双击导入注册表WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\Cur......
  • 解决 OSError: [WinError -1066598274] Windows Error 0xc06d007e (xjl456852原创)
    异常OSError:[WinError-1066598274]WindowsError0xc06d007e或Processfinishedwithexitcode-1066598274(0xC06D007E)遇到问题:程序在调用PCA方法时,出现上述异常.这种PCA方法使用sklearn中的依赖包.我尝试了pip和mamba重新安装多个依赖包之后问题得到解决(只选择一......
  • 在Windows 10上安装和配置EasyGUI库的步骤
     EasyGUI是一个方便易用的Python库,可以帮助开发者快速构建图形用户界面(GUI)应用程序。下面是在Windows10上安装和配置EasyGUI库的步骤: 1.安装Python: 首先,确保你的Windows10系统已经安装了Python解释器。 2.安装pip: 在Windows10上,可以通过以下步骤安装pip包管理器: -打开命......
  • 筑基-Windows&Linux常用命令
    1.针对文件管理和字符处理cdL切换目录~当前用户家目录~username特定用户的家目录-工作区切换前的上一个目录.当前目录..上一级目录cdW切换目录.当前目录..上一级目录不加参数显示当前所在目录路径pwdL显示当前工作目录lsL显示目录内容-a显......
  • 思科wlc使用windows radius 认证配置
    原贴https://www.cnblogs.com/sanjiu/p/14131980.html思科wlc使用windowsradius认证配置  目录一      需求介绍:...2二      实验环境:...2三      windows环境安装...33.1     第一步,安装windows环境。...33.2     第......
  • C++调用opencv和windows api完成桌面窗口截图——以梦幻西游为例
    目录程序简介程序/数据集下载代码环境、文件结构代码分析结果展示程序简介项目编写的C++程序,根据输入的字符串,遍历所有桌面窗口标题,查找包含该标题的窗口,对该桌面窗口进行截图,以梦幻西游为例输入:桌面窗口包含的字符串比如输入“梦幻”,程序就会截取桌面“梦幻西游”的窗口输......
  • Windows:定时关机任务
    点击Win键+R打开运行,输入下面的代码:shutdown-s-t9000其中9000是时间,单位为秒,这段代码的意思是,注册一个9000秒(两个半小时)后关机的任务,运行成功后会有如下显示:如果你需要取消关机任务,请输入:shutdown-a如果成功,会显示下面的图片......
  • windowserver2012服务器部署.net core3.1环境
    一、安装.netcore3.1要先具备这些系统补丁,如果没有则需要安装,这些KB必须按以下顺序安装:(clearcompressionflag.exe、KB2919442、KB2919355、KB2932046、KB2959977、KB2937592、KB2938439、KB2934018)安装过程中需要多次重启生效。最后安装vc_redist.x64.exe)二、.netcore3.......
  • 【新工具】从零配置Vim+Latex提升写作效率(Windows)
    1.首先安装gvimwelcomehome:vimonline2.接着安装vimplugGitHub-junegunn/vim-plug::hibiscus:MinimalistVimPluginManager或终端直接运行iwr-usebhttps://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim|`ni$HOME/vimfiles/autoload/plu......
  • python的 __enter__ 和 __exit__方法,上下文管理器
    在Python中,类并没有专门的exit方法。但是,如果你想在对象生命周期结束时执行某些操作,你可以使用特殊的方法__enter__和__exit__,这与Python上下文管理器(ContextManager)相关。__enter__方法:当进入with代码块时,__enter__方法会被调用。__exit__方法:当退出with......