前言
关于SetupDiGetDeviceProperty函数的第三个参数(const DEVPROPKEY *PropertyKey),翻遍了官方文档,也没找到具体的使用方法,直接按文档里赋值一直提示“错误 LNK2001:未解析的外部符号”。折腾了大半天,终于在StackOverflow上找到了同问题。
简单介绍
因为个人项目,需要在windows平台上使用设备管理器相关API获取到特定设备的相关属性。查阅了相关资料后找到了微软官方的提供SetupDi系列的函数。
关于获取设备的属性,大多数人使用函数是SetupDiGetDeviceRegistryProperty,可以理解为这个函数是用于获取设备的注册表属性值,其具体的使用方法不是本文重点,重点是其属性值是有限的,找不到本人相应查找的属性。
因此找到了SetupDiGetDeviceProperty函数,相比前一个函数,这个函数可以直接获取用于描述设备的特征属性值,而不是从注册表中获取,因此其提供的可选属性值更多。
具体方法
关于前置的SetupDiGetClassDevs,SetupDiEnumDeviceInfo请参考其他资料。
在具体使用SetupDiGetDeviceProperty时,第三个参数正确做法是直接使用官方提供的属性键,并用&取址。
SetupDiGetDeviceProperty(deviceInfoSet, &deviceInfoData, &DEVPKEY_Device_DriverDesc, &propertyType, (BYTE*)propertyBuffer, sizeof(propertyBuffer), &requiredSize, 0))
官方提供的属性键定义在 #include <devpkey.h> 库中。
重点来了:
不能只导入这个库,还需要导入下面这两个库,并且initguid库要在devpropdef库的前面,然后再导入devpkey库,具体使用如下:
#include <initguid.h> // include before devpropdef.h
#include <devpropdef.h>
#include <devpkey.h> // struct DEVPROPKEY
然后终于解决了前面的问题,感谢stackoverflow上的原问题。
吐槽一下,微软官方文档写的真不完善。