我试图通过SetupDiEnumDeviceInterfaces()
获取与特定PnP枚举器对应的所有设备的设备接口数据。请考虑以下示例(仅适用于索引为0的接口):
#include <stdio.h>
#include <Windows.h>
#include <SetupAPI.h>
static int get_interface(HDEVINFO);
int main()
{
HDEVINFO devInfoSet = SetupDiGetClassDevsA(NULL, "USBSTOR", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if (devInfoSet == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "SetupDiGetClassDevsA: Error %lu\n", GetLastError());
return 1;
}
int ret = get_interface(devInfoSet);
SetupDiDestroyDeviceInfoList(devInfoSet);
return ret;
}
int get_interface(HDEVINFO devInfoSet)
{
SP_DEVICE_INTERFACE_DATA devIface = { sizeof(SP_DEVICE_INTERFACE_DATA) };
if (!SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &GUID_DEVINTERFACE_DISK, 0, &devIface))
{
fprintf(stderr, "SetupDiEnumDeviceInterfaces: Error %lu\n", GetLastError());
return 1;
}
/* ... */
}
(此示例的更完整版本可用here。)
运行后,SetupDiEnumDeviceInterfaces()
失败,GetLastError()
返回错误259(ERROR_NO_MORE_ITEMS
),就好像没有设备信息集开头的任何接口一样。这似乎是为设备设置类而不是设备接口类获取的所有设备信息集的行为。
但是,当我将DIGCF_DEVICEINTERFACE
标志添加到SetupDiGetClassDevsA()
调用的最后一个参数时,以便为接口类获取集合,后者失败并返回错误13(ERROR_INVALID_DATA
)。当指定的PnP枚举器未在系统中注册时,设备设置类通常会出现相同的错误。实际上,当我用NULL
替换枚举器参数时,接口成功获取。 According to MSDN,指定DIGCF_DEVICEINTERFACE
标志允许使用设备实例id代替枚举器参数,但我发现上述设备实例ID和NULL
是{的唯一选项{1}}调用枚举器参数,当它出现SetupDiGetClassDevs()
标志时,其中实际枚举数不在选项范围内。
请你解释一下,这里到底发生了什么?我不熟悉SetupAPI语义,所以我无法说明为设备设置类设置的设备信息设置有哪些限制,与设备接口类相比。此外,这里可能有一些特定于版本的行为吗?上面的代码在Windows 7 x64系统上进行了测试,但它本身被编译成32位可执行文件。我需要特别知道,为此建议的任何特定解决方案是否适用于良好的ol&#39; Windows XP也是如此。
P.S。尽管有类似的潜在目的,但并不是Getting device path for CreateFile while enumerating devices with SetupDiEnumDeviceInfo的重复。 ;)