0

マシンの USB ドライブを一覧表示したい。VC++ でそれを行う方法。サンプルコードを教えてください。

4

2 に答える 2

4

GetDriveType のドキュメントによると、SetupDiGetDeviceRegistryPropertyを使用する必要があると書かれており、次のように引用します。

ドライブが USB タイプのドライブかどうかを判断するには、SetupDiGetDeviceRegistryProperty を呼び出し、SPDRP_REMOVAL_POLICY プロパティを指定します。

いくつかのテストを実行しましたが、特定のデバイスが USB ドライブであることを示す兆候は見つかりませんでした。 SPDRP_REMOVAL_POLICY多くのデバイス(および私のUSBドライブ)に対して2を返すため、実際には使用できません。and filter only で呼び出すSetupDiGetDeviceRegistryPropertyと、多くのデバイスが得られます (削除ポリシーと組み合わせても、USB ドライブを見つける方法が適切に示されません。また、 with で呼び出すと、常にエラー 13 (「データが無効です」) が返されます。理由がわかりません。SPDRP_CAPABILITIESCM_DEVCAP_REMOVABLESetupDiGetDeviceRegistryPropertySPDRP_DEVTYPE

ここにいくつかのコードがあります:

void SetupDiInformation()
{
    HDEVINFO hDevInfo = SetupDiGetClassDevsW(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
    if (INVALID_HANDLE_VALUE == hDevInfo)
    {
        fwprintf(stderr, L"Error SetupDiCreateDeviceInfoList: %d\n", GetLastError());
        return;
    }

    SP_DEVINFO_DATA devInfoData;
    devInfoData.cbSize = sizeof(devInfoData);
    BOOL success;
    success = SetupDiEnumDeviceInfo(hDevInfo, 0, &devInfoData);
    for (int i=1; success; i++)
    {
        DWORD regDataType = REG_NONE, reqSize = 0;
        WCHAR deviceDesc[MAX_PATH+1] = {0};
        DWORD deviceType = -1, capabilities = -1;
        DWORD removalPolicy = CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL;
        BOOL regPropSuccess = false;

/*
        regDataType = REG_NONE; reqSize = 0;
        regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
            SPDRP_DEVTYPE, &regDataType, 
            (PBYTE)&deviceType, sizeof(deviceType), &reqSize);
        if (!regPropSuccess)
        {
            fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_DEVTYPE)[%d]: %d\n", i, GetLastError());
        }
*/

        regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
            SPDRP_DEVICEDESC, &regDataType, 
            (PBYTE)deviceDesc, sizeof(deviceDesc), &reqSize);
        if (!regPropSuccess)
        {
            fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_DEVICEDESC)[%d]: %d\n", i, GetLastError());
        }


        regDataType = REG_NONE; reqSize = 0;
        regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
            SPDRP_CAPABILITIES, &regDataType, 
            (PBYTE)&capabilities, sizeof(capabilities), &reqSize);
        if (!regPropSuccess)
        {
            fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_CAPABILITIES)[%d]: %d\n", i, GetLastError());
        }  

        regDataType = REG_NONE; reqSize = 0;
        regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
            SPDRP_REMOVAL_POLICY, &regDataType, 
            (PBYTE)&removalPolicy, sizeof(removalPolicy), &reqSize);
        if (!regPropSuccess)
        {
            fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_REMOVAL_POLICY)[%d]: %d\n", i, GetLastError());
        }  

        if ((CM_DEVCAP_REMOVABLE & capabilities) != 0)
        {
            wprintf(L"% 4d. ", i);
            wprintf(L"%X-%04X-%X-", 
                devInfoData.ClassGuid.Data1, 
                devInfoData.ClassGuid.Data2, 
                devInfoData.ClassGuid.Data3);
            int data4len = sizeof(devInfoData.ClassGuid.Data4)/sizeof(devInfoData.ClassGuid.Data4[0]);
            for (int j=0; j<data4len; j++)
                wprintf(L"%02X", devInfoData.ClassGuid.Data4[j]);

            if (wcslen(deviceDesc) > 30)
                deviceDesc[30]=L'\0';
            //wprintf(L" %-8d%-30s 0x%08X %d [%d] ", devInfoData.DevInst, deviceDesc, deviceType, removalPolicy, capabilities);
            wprintf(L" %-8d%-30s %d [%d] ", devInfoData.DevInst, deviceDesc, removalPolicy, capabilities);
            //DisplayCapabilities(capabilities);
            wprintf(L"\n");
        }

        success = SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData);
    }

    DWORD lastError = GetLastError();
    if (lastError != ERROR_NO_MORE_ITEMS)
    {
        // error occurred
        fwprintf(stderr, L"Error SetupDiEnumDeviceInfo: %d\n", lastError);
    }

    if (!SetupDiDestroyDeviceInfoList(hDevInfo))
    {
        fwprintf(stderr, L"Error SetupDiDestroyDeviceInfoList: %d\n", GetLastError());
        return;
    }
}
于 2011-02-09T16:45:14.573 に答える
0

誰かにコードを書いてもらうつもりはないと思います。あなたはプログラマーであり、それが(おそらく)あなたの仕事です。

ただし、 GetLogicalDriveStringsGetDriveTypeから始めることができます。

于 2010-04-22T05:28:54.763 に答える