我得到了一个像
这样的设备实例路径L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"
来自IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink 但是对于CM_Get_Parent,我需要设备的DEVINST / DWORD让我发疯 我试过了例如
instancePath = L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}";
HDEVINFO hinfo = SetupDiGetClassDevs(NULL, instancePath, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
和其他一些SetupDi ...伏都教没有成功。任何帮助都受到高度赞赏,因为 - 如上所述 - 我现在无法绕过这种疯狂几个小时,虽然有相反的几十个例子(devid->实例路径)但我还没有找到任何帮助例如path-> DEVINST。
答案 0 :(得分:0)
正如您所说,没有直接的方法。
但是,您应该能够通过一些字符串编辑从“设备路径/设备接口ID”中获取“设备实例ID”,具体步骤如下:
\\\\?\\
的开始部分,直到USB
。{...}
部分#
替换为\
从
开始"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"
您现在应该拥有
"USB\VID_0403&PID_6001\6&2cc2d230&0&2\"
,它应该是有效的设备实例ID。如果不是,请尝试也删除最后一个“ \”。
然后,您可以将其输入CM_Locate_DevNode()并获取所需的DEVINST。
答案 1 :(得分:0)
虽然修改路径可能会起作用,但Windows文档明确指出您不应解析设备路径。
不过,您可以使用CfgMgr32 API来做到这一点,方法是使用CM_Get_Device_Interface_PropertyW()和DEVPKEY_Device_InstanceId:
#include <cfgmgr32.h>
#include <initguid.h> // needed for devpkey.h to parse properly
#include <devpkey.h>
#include <cassert>
#include <string>
#include <vector>
std::wstring map_path(LPCWSTR device_path) {
ULONG buf_size = 0;
DEVPROPTYPE type;
CM_Get_Device_Interface_PropertyW(
name, &DEVPKEY_Device_InstanceId, &type,
nullptr, &buf_size, 0);
std::vector<BYTE> buffer(buf_size);
auto result = CM_Get_Device_Interface_PropertyW(
name, &DEVPKEY_Device_InstanceId, &type,
buffer.data(), &buf_size, 0);
assert(result == CR_SUCCESS);
assert(type == DEVPROP_TYPE_STRING);
// buffer will be null-terminated
return reinterpret_cast<wchar_t*>(buffer.data());
}