我在使上述功能正常工作时遇到问题。我已经阅读了MSDN和文档,这是我想出的,但是失败了。

因此,我已使用SetupDiGetClassDevs列出所有设备,然后将其存储到句柄中。没问题,然后下一步是使用SetupDiEnumDeviceInterfaces枚举每个设备并传递句柄值。这是我丢失的地方,它总是返回false。希望能就我哪里出错了提供一些建议。谢谢阅读。

#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#pragma comment(lib,"SetupAPI")
//
int main()
{
    // Set up handles and data storage
    HDEVINFO hDevInfo;
    // Load GUID Classes
    static GUID GUID_DEVINTERFACE_USB_HUB={ 0xf18a0e88, 0xc30c, 0x11d0, {0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8} };
    static GUID GUID_DEVINTERFACE_USB_DEVICE ={ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
    static GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER={ 0x3abf6f2d, 0x71c4, 0x462a, {0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27}};
    //
    SP_DEVICE_INTERFACE_DATA ifdata;
    // Create a HDEVINFO with all present devices.
    hDevInfo = SetupDiGetClassDevs(NULL,0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
    //
        if (INVALID_HANDLE_VALUE == hDevInfo)
        {
        return FALSE;
        }
        else
        {
        printf("Device info set handle for all devices attached to system: 0x%x\n", hDevInfo);
        }
    //
    BOOL bResult = TRUE;
    DWORD nCount = 0;
    //
        while (bResult)
        {
        //
            ifdata.cbSize=sizeof(ifdata);
            //
            bResult = SetupDiEnumDeviceInterfaces(
            hDevInfo,
            NULL,
            &GUID_DEVINTERFACE_USB_DEVICE,
            (ULONG)nCount,
            &ifdata);


        //
        if(!bResult)
            {
            printf("Error Failed\n");
            //fails here with error 6 invalid handle
            }
        }



    // Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
    //
    system ("pause");
    //
    return 0;

}

最佳答案

您对SetupDiGetClassDevs的调用是错误的,因为设备信息设置了它返回的元素,最终导致缺少SetupDiEnumDeviceInterfaces需要工作的设备接口列表。

请参见SetupDiGetClassDevs documentation on msdn的备注部分:


  要返回支持任何类别的设备接口的设备,请设置
  DIFCF_DEVICEINTERFACE标志,设置DIGCF_ALLCLASSES标志,并设置
  ClassGuid为NULL。该功能添加到设备信息集
  代表此类设备的设备信息元素,然后添加
  到设备信息元素的设备接口列表
  包含设备支持的所有设备接口。


因此,通过添加SetupDiGetClassDevs标志来修复您的DIGCF_DEVICEINTERFACE调用,例如:

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

07-28 04:02