Windows下獲取設備管理器列表信息-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的使用- SetupDiGetClassDevs -->獲取設備信息的集合
- SetupDiEnumDeviceInfo -->針對具體的設備解析信息
- 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 | 返回設備信息的集合 |
拿到設備信息集合之后,使用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 | 具體的設備信息數據 |
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(可選) |
MSDN頁面-SetupDiGetDeviceRegistryPropertyW
需要注意的是
- windows API 通常分單雙字節版本,單字節版本一般調用A結尾的API,對應的VS項目屬性中字符集為Multi-Byte,雙字節版本一般調用以w結尾的API,對應VS項目屬性中字符集為Unicode。本例項目屬性為Unicode,對應雙字節字符串版本,所以輸出信息以wcout輸出,緩沖區指針轉換為wchar_t*
- TCHAR為自動根據項目中字符集屬性轉為char(Multi-Byte)或wchar(Unicode)
作者:robot2017
出處:http://www.rzrgm.cn/stephen2023/p/17898051.html
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
出處:http://www.rzrgm.cn/stephen2023/p/17898051.html
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
浙公網安備 33010602011771號