首页 > 编程语言 >C++实现获取设备管理器中的设备信息

C++实现获取设备管理器中的设备信息

时间:2024-05-28 18:59:19浏览次数:17  
标签:spDevInfoData 管理器 MAX C++ hDevInfo SPDRP PATH NULL 设备

 C++实现获取设备管理器中的设备信息,基本调用了windows API函数,除此之外,还引用了setupapi.lib库,代码如下所示:

// PrintDeviceInfo.cpp : 定义控制台应用程序的入口点。

//

#include <stdio.h>

#include <locale.h>

#include <Windows.h>

#include <setupapi.h>

#pragma comment(lib, "setupapi.lib")

void  PrintDevicesInfo1()

{

HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);

if (hDevInfo == INVALID_HANDLE_VALUE)

{

printf("SetupDiGetClassDevs Err:%d", GetLastError());

return;

};

SP_CLASSIMAGELIST_DATA _spImageData = { 0 };

_spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);

SetupDiGetClassImageList(&_spImageData);

SP_DEVINFO_DATA spDevInfoData = { 0 };

spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)

{

char  szBuf[MAX_PATH] = { 0 };

int  wImageIdx = 0;

short  wItem = 0;

if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_CLASS, NULL, (PBYTE)szBuf, MAX_PATH, 0))

{

continue;

};

if (SetupDiGetClassImageIndex(&_spImageData, &spDevInfoData.ClassGuid, &wImageIdx))

{

char  szName[MAX_PATH] = { 0 };

DWORD  dwRequireSize;

if (!SetupDiGetClassDescription(&spDevInfoData.ClassGuid, (PWSTR)szBuf, MAX_PATH, &dwRequireSize))

{

continue;

};

wprintf(L"Class:%s\r\n", szBuf);

if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0))

{

wprintf(L"FriendlyName:%s\r\n\r\n", szName);

}

else  if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0))

{

wprintf(L"Device:%s\r\n\r\n", szName);

}

}

}

SetupDiDestroyClassImageList(&_spImageData);

}

int PrintDevicesInfo2()

{

// 得到所有设备 HDEVINFO    

HDEVINFO hDevInfo;

hDevInfo = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES);

if (hDevInfo == INVALID_HANDLE_VALUE)

{

wprintf(L"SetupDiGetClassDevs Err:%d", GetLastError());

return -1;

};

// 循环列举   

SP_DEVINFO_DATA DeviceInfoData;

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)

{

WCHAR   szClassBuf[MAX_PATH] = { 0 };

WCHAR   szDescBuf[MAX_PATH] = { 0 };

WCHAR   locinfo[MAX_PATH] = { 0 };

WCHAR   friendName[MAX_PATH] = { 0 };

// 获取类名  

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS, NULL, (PBYTE)szClassBuf, MAX_PATH - 1, NULL))

{

}

//获取设备描述信息

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szDescBuf, MAX_PATH - 1, NULL))

{

}

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION, NULL, (PBYTE)locinfo, sizeof(locinfo), NULL))

{

}

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)friendName, sizeof(friendName), NULL))

{

}

wprintf(L"Class:%s\r\nDesc:%s\nLocoInfo:%s\nFriendName:%s\r\n\r\n", szClassBuf, szDescBuf, locinfo,friendName);

}

//  释放     

SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;

}

int  main(int  argc, char* argv[])

{

printf("Locale is: %s\n", setlocale(LC_ALL, "chs"));

PrintDevicesInfo1();

//PrintDevicesInfo2();

getchar();

return  0;

}

// PrintDeviceInfo.cpp : 定义控制台应用程序的入口点。

//

#include <stdio.h>

#include <locale.h>

#include <Windows.h>

#include <setupapi.h>

#pragma comment(lib, "setupapi.lib")

void  PrintDevicesInfo1()

{

HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);

if (hDevInfo == INVALID_HANDLE_VALUE)

{

printf("SetupDiGetClassDevs Err:%d", GetLastError());

return;

};

SP_CLASSIMAGELIST_DATA _spImageData = { 0 };

_spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);

SetupDiGetClassImageList(&_spImageData);

SP_DEVINFO_DATA spDevInfoData = { 0 };

spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)

{

char  szBuf[MAX_PATH] = { 0 };

int  wImageIdx = 0;

short  wItem = 0;

if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_CLASS, NULL, (PBYTE)szBuf, MAX_PATH, 0))

{

continue;

};

if (SetupDiGetClassImageIndex(&_spImageData, &spDevInfoData.ClassGuid, &wImageIdx))

{

char  szName[MAX_PATH] = { 0 };

DWORD  dwRequireSize;

if (!SetupDiGetClassDescription(&spDevInfoData.ClassGuid, (PWSTR)szBuf, MAX_PATH, &dwRequireSize))

{

continue;

};

wprintf(L"Class:%s\r\n", szBuf);

if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0))

{

wprintf(L"FriendlyName:%s\r\n\r\n", szName);

}

else  if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0))

{

wprintf(L"Device:%s\r\n\r\n", szName);

}

}

}

SetupDiDestroyClassImageList(&_spImageData);

}

int PrintDevicesInfo2()

{

// 得到所有设备 HDEVINFO    

HDEVINFO hDevInfo;

hDevInfo = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES);

if (hDevInfo == INVALID_HANDLE_VALUE)

{

wprintf(L"SetupDiGetClassDevs Err:%d", GetLastError());

return -1;

};

// 循环列举   

SP_DEVINFO_DATA DeviceInfoData;

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)

{

WCHAR   szClassBuf[MAX_PATH] = { 0 };

WCHAR   szDescBuf[MAX_PATH] = { 0 };

WCHAR   locinfo[MAX_PATH] = { 0 };

WCHAR   friendName[MAX_PATH] = { 0 };

// 获取类名  

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS, NULL, (PBYTE)szClassBuf, MAX_PATH - 1, NULL))

{

}

//获取设备描述信息

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szDescBuf, MAX_PATH - 1, NULL))

{

}

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION, NULL, (PBYTE)locinfo, sizeof(locinfo), NULL))

{

}

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)friendName, sizeof(friendName), NULL))

{

}

wprintf(L"Class:%s\r\nDesc:%s\nLocoInfo:%s\nFriendName:%s\r\n\r\n", szClassBuf, szDescBuf, locinfo,friendName);

}

//  释放     

SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;

}

int  main(int  argc, char* argv[])

{

printf("Locale is: %s\n", setlocale(LC_ALL, "chs"));

PrintDevicesInfo1();

//PrintDevicesInfo2();

getchar();

return  0;

}

运行结果如下所示:

 

标签:spDevInfoData,管理器,MAX,C++,hDevInfo,SPDRP,PATH,NULL,设备
From: https://blog.csdn.net/qq_57661075/article/details/139245002

相关文章

  • C++实现删除打印机副本功能
     我们要实现此功能,首先需要获取到打印机的名称,其次是将获取到的打印机名称依次删除。一、获取打印机副本名称1.我们获取打印机副本名称,可以使用windowsAPI中的EnumPrinters函数,该函数可以枚举出我们电脑中的打印机设备信息,该函数使用方法如下:DWORDFlags=PRINTER_ENU......
  • C++实现dll文件的显示调用
    我们实现dll文件的显示调用,主要分为三个步骤:创建DLL、导出函数、使用DLL。其中离不开WindowsAPI函数,使用到了LoadLibrary、GetProcAddress、 FreeLibrary等,以下是一个简单的示例程展示整个过程。:1.创建DLLMyLibrary.h//MyLibrary.h#ifndefMY_LIBRARY_H#defineMY_LI......
  • C++跨平台库boost和Poco的编译
    PrerequisitesCMake3.5ornewerAC++17compiler(VisualC++2022,GCC8.0,Clang5,ornewer)在window下编译依赖的三方库编译POCO$gitclone-bmasterhttps://github.com/pocoproject/poco.git$cdpoco$mkdircmake-build$cdcmake-build$cmake..$cma......
  • C++17 链接 C++11 lib 出现重复定义
    C++11实现staticconstexpr是按照conststatic实现的,需要在.cpp中定义://tmp.hclassStatisTest{public:staticconstexprconstcharliteral[]="xxxliteral";};//tmp.cc#include"tmp.h"constcharStatisTest::literal[];//compile......
  • Motrix下载管理器:开源优雅高效的下载工具
    原文地址:https://itxiaozhang.com/motrix-download-manager-open-source-efficient-tool/本文配合视频食用效果最佳,视频教程在文章末尾。简介Motrix是一款对用户友好的全能型下载管理软件,它融合了简约直观的界面与强大的功能特性,帮助用户高效地下载并管理多元化的文件类型。......
  • 设备刷机停网 卡板设备双限速
    限时创业版回馈:    活动有效期:2024-05-28~2024-06-28   一、近期更新介绍开放API完善:        单个API限制频次、ip白名单 (配置API) 卡码说明:        可配置卡码说明及落地页信息等 (卡码配置)(卡码说明)自定义绑定页及首页风格: ......
  • 阿赵UE引擎C++编程学习笔记——文件夹操作和文件读写
      大家好,我是阿赵。  这次学习一下在UE里面使用C++的API操作文件读写和文件夹操作。一、UE引擎获取相关路径  获取到路径一般是相对路径,使用FPaths::ConvertRelativePathToFull转换后,可以获得完整的绝对路径。FStringcontentDir=FPaths::ProjectContentDir();......
  • 《C++primer》第八章课后习题
    练习8.1istream&abc(istream&is){ strings; is>>s; cout<<s; s.clear(); returnis;}练习8.2abc(cin);练习8.3答:输入类型与i不符,或者输入结束标识练习8.4vector<string>s;voidabc(strings1){ strings2; ifstreamin(s1); while(getline(......
  • 《C++primer》读书笔记---第八章:IO库
    8.1IO类下表列出的是一些IO类型:  为了支持使用宽字符的语言,标准库定义了一组类型和对象来操纵wchar_t类型的数据。宽字符版本的类型和函数的名字以一个w开始,例如,wcin、wcout、wcerr是分别对应cin、cout、cerr的宽字符类型。注:IO对象无拷贝或赋值ofstreamout1,out2;......
  • .net core的WebAPI+Vue2实现调用设备拍照上传图片功能
    在工作中有时候会遇到上传文件上传图片或者拍照上传图片功能。这时候底下的内容就有可能可以帮助到你。后端的支持上传图片和上传文件功能。前端如果你选择普通上传功能就是普通上传功能,我这里选择的是调用相机设备实现拍照上传图片功能。1.首先这是后端的控制器接口。1///<......