Windows SetupDigetClassDev是否使用文档中的设备实例ID?
根据MSDN文档,可以通过a获得特定设备的a: 要仅返回特定设备,请设置 DIFCF_设备接口标志和使用 用于提供 设备的设备实例ID 我通过解析消息事件中的符号名来获取设备实例ID,并通过将结果ID与从中返回的ID进行比较来验证结果ID。即使传递操作系统提供的设备实例ID也不起作用(即SetupDiGetClassDevs调用失败,出现Windows SetupDigetClassDev是否使用文档中的设备实例ID?,windows,winapi,device,hardware-interface,setupapi,Windows,Winapi,Device,Hardware Interface,Setupapi,根据MSDN文档,可以通过a获得特定设备的a: 要仅返回特定设备,请设置 DIFCF_设备接口标志和使用 用于提供 设备的设备实例ID 我通过解析消息事件中的符号名来获取设备实例ID,并通过将结果ID与从中返回的ID进行比较来验证结果ID。即使传递操作系统提供的设备实例ID也不起作用(即SetupDiGetClassDevs调用失败,出现错误\u无效\u参数) 我当前为新到达的设备获取结构的解决方法是枚举同一类中的所有设备,并将SetupDiGetDeviceInstanceId的结果与符号名进
错误\u无效\u参数
)
我当前为新到达的设备获取结构的解决方法是枚举同一类中的所有设备,并将SetupDiGetDeviceInstanceId的结果与符号名进行比较。然而,根据文档,我不明白为什么这是必要的
有没有人让SetupDiGetClassDevs以这种方式工作?是否有更好的方法使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?似乎您必须指定
DIGCF_ALLCLASSES
标志以查找与给定设备实例id匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT
标志
这对我很有用:
void error(DWORD err)
{
WCHAR buf[0x200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, 0x200, NULL);
wprintf(L"%x: %s\n", err, buf);
}
int _tmain(int argc, _TCHAR* argv[])
{
PCWSTR devinst = L"HID\\VID_413C&PID_2105\\6&22CE0F66&0&0000";
HDEVINFO hinfo = SetupDiGetClassDevs(NULL, devinst, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
if (hinfo == INVALID_HANDLE_VALUE)
{
error(GetLastError());
return 1;
}
SP_DEVINFO_DATA dinfo;
dinfo.cbSize = sizeof(dinfo);
int ix = 0;
while (SetupDiEnumDeviceInfo(hinfo, ix++, &dinfo))
{
wprintf(L"Match\n");
}
error(GetLastError());
SetupDiDestroyDeviceInfoList(hinfo);
return 0;
}
输出:
Match
103: No more data is available.
似乎您误解了DBT\u DEVICEARRIVAL 有几种不同类型的
DBT_DEVICEARRIVAL
消息——用于卷、句柄和设备接口。我猜你说的是DBT_DEVTYP_设备接口的多样性。在这种情况下,DEV\u BROADCAST\u DEVICEINTERFACE
结构的dbcc\u name
字段将包含“设备接口路径”
“设备接口路径”与“设备实例ID”不同
如果您想了解有关此设备的更多信息,应通过此设备接口GUID(通过带有DIGCF\u DEVICEINTERFACE的SetupDiGetClassDevs)枚举所有设备接口,并将dbcc_名称与
setupDienumDeviceInterface
检索到的字符串进行比较,DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES是我缺少的部分。从MSDN文档中,我了解到只有DIGCF_DEVICEINTERFACE是必要的,但这会导致错误87(错误参数)。