0

この上記の機能を動作させるのに問題があります。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;

}
4

1 に答える 1

3

への呼び出しSetupDiGetClassDevsは正しくありません。それが返すデバイス情報セットの要素が、機能する必要があるデバイス インターフェイス リストを欠いてしまうためSetupDiEnumDeviceInterfacesです。

SetupDiGetClassDevsmsdn に関するドキュメントのコメント セクションを参照してください。

任意のクラスのデバイス インターフェイスをサポートするデバイスを返すには、DIFCF_DEVICEINTERFACE フラグを設定し、DIGCF_ALLCLASSES フラグを設定して、ClassGuid を NULL に設定します。この関数は、そのようなデバイスを表すデバイス情報要素をデバイス情報セットに追加し、デバイスがサポートするすべてのデバイス インターフェイスを含むデバイス インターフェイス リストをデバイス情報要素に追加します。

したがって、次のようなフラグSetupDiGetClassDevsを追加して呼び出しを修正します。DIGCF_DEVICEINTERFACE

hDevInfo = SetupDiGetClassDevs(NULL,0,0, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
于 2012-09-18T23:10:00.080 に答える