Visual c++ 在VC+中列出USB驱动器号+;

Visual c++ 在VC+中列出USB驱动器号+;,visual-c++,drive-letter,Visual C++,Drive Letter,我想在我的机器中列出USB驱动器。 如何在VC++中实现。你能给出一个示例代码吗?我认为你不会让任何人为你编写代码:你是一名程序员,这(大概)是你的工作 但是,您可以从和开始。我认为您不会让任何人为您编写代码:您是一名程序员,这(大概)是您的工作 但是,您可以从和开始。根据GetDriveType的文档,它说我们应该用于,我引用: 要确定驱动器是否为USB类型驱动器,请调用SetupDiGetDeviceRegistryProperty并指定SPDRP_Removing_策略属性 我做了一些测试

我想在我的机器中列出USB驱动器。
如何在VC++中实现。你能给出一个示例代码吗?

我认为你不会让任何人为你编写代码:你是一名程序员,这(大概)是你的工作


但是,您可以从和开始。

我认为您不会让任何人为您编写代码:您是一名程序员,这(大概)是您的工作


但是,您可以从和开始。

根据GetDriveType的文档,它说我们应该用于,我引用:

要确定驱动器是否为USB类型驱动器,请调用SetupDiGetDeviceRegistryProperty并指定SPDRP_Removing_策略属性

我做了一些测试,没有发现任何迹象表明某个设备是USB驱动器。
SPDRP\u removation\u POLICY
为许多设备(以及我的USB驱动器)返回2,因此我无法真正使用它。使用
SPDRP\u功能调用
SetupDiGetDeviceRegistryProperty
并仅过滤
CM\u DEVCAP\u REMOVABLE
也会提供许多设备(即使与删除策略结合使用,也无法很好地指示如何查找我的USB驱动器)。 另外,使用
SPDRP_DEVTYPE
调用
SetupDiGetDeviceRegistryProperty
总是返回错误13(“数据无效”),我不知道为什么

下面是一些代码:

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;
    }
}
无效设置信息()
{
HDEVINFO HDEVINFO=SetupDiGetClassDevsW(NULL,NULL,NULL,DIGCF_PRESENT | DIGCF_ALLCLASSES);
if(无效的句柄值==hDevInfo)
{
fwprintf(stderr,L“错误设置创建设备信息列表:%d\n”,GetLastError());
返回;
}
SP_DEVINFO_数据DEVINFO数据;
devinfo.cbSize=sizeof(devinfo数据);
成功;
成功=SetupDiEnumDeviceInfo(hDevInfo、0和devinfo数据);
for(int i=1;success;i++)
{
DWORD REGDATYPE=REG\U NONE,reqSize=0;
WCHAR deviceDesc[MAX_PATH+1]={0};
DWORD设备类型=-1,功能=-1;
DWORD removalPolicy=CM_Removation_POLICY_EXPECT_NO_Removation;
BOOL regPropSuccess=false;
/*
regDataType=REG_NONE;reqSize=0;
regPropSuccess=SetupDiGetDeviceRegistrProperty(hDevInfo和devinfo数据、,
SPDRP_DEVTYPE和regDataType,
(PBYTE)和设备类型、sizeof(设备类型)和reqSize;
如果(!regPropSuccess)
{
fwprintf(stderr,L“错误设置DiGetDeviceRegistryProperty(SPDRP_DEVTYPE)[%d]:%d\n”,i,GetLastError());
}
*/
regPropSuccess=SetupDiGetDeviceRegistrProperty(hDevInfo和devinfo数据、,
SPDRP_DEVICEDESC和regDataType,
(PBYTE)deviceDesc、sizeof(deviceDesc)和reqSize;
如果(!regPropSuccess)
{
fwprintf(stderr,L“错误设置DiGetDeviceRegistryProperty(SPDRP_DEVICEDESC)[%d]:%d\n”,i,GetLastError());
}
regDataType=REG_NONE;reqSize=0;
regPropSuccess=SetupDiGetDeviceRegistrProperty(hDevInfo和devinfo数据、,
SPDRP_功能和regDataType,
(PBYTE)和能力、sizeof(能力)和reqSize);
如果(!regPropSuccess)
{
fwprintf(stderr,L“错误设置DiGetDeviceRegistryProperty(SPDRP_功能)[%d]:%d\n”,i,GetLastError());
}  
regDataType=REG_NONE;reqSize=0;
regPropSuccess=SetupDiGetDeviceRegistrProperty(hDevInfo和devinfo数据、,
SPDRP\u删除\u策略和regDataType,
(PBYTE)和removalPolicy、sizeof(removalPolicy)和reqSize;
如果(!regPropSuccess)
{
fwprintf(stderr,L“错误设置DiGetDeviceRegistryProperty(SPDRP\u删除\u策略)[%d]:%d\n”,i,GetLastError());
}  
如果((CM_DEVCAP_可移动和功能)!=0)
{
wprintf(L“%4d.”,i);
wprintf(L“%X-%04X-%X-”,
devInfoData.ClassGuid.Data1,
devInfoData.ClassGuid.Data2,
devinfo.ClassGuid.Data3);
int data4len=sizeof(devinfo.ClassGuid.Data4)/sizeof(devinfo.ClassGuid.Data4[0]);
对于(int j=0;j 30)
deviceDesc[30]=L'\0';
//wprintf(L“%-8d%-30s 0x%08X%d[%d]”,devinfo.DevInst,deviceDesc,deviceType,removalPolicy,capabilities);
wprintf(L“%-8d%-30s%d[%d]”,devinfo.DevInst,deviceDesc,removalPolicy,capabilities);
//显示能力(能力);
wprintf(L“\n”);
}
成功=SetupDiEnumDeviceInfo(hDevInfo、i和devinfo数据);
}
DWORD lastError=GetLastError();
如果(lastError!=错误\u无\u更多\u项)
{
//发生错误
fwprintf(标准,L“错误设置DienumDeviceInfo:%d\n”,最后一个错误);
}
如果(!setupDiDestroyDeviceInfo列表(hDevInfo))
{
fwprintf(stderr,L“错误设置DiDestroyDeviceInfo列表:%d\n”,GetLastError());
返回;
}
}

根据GetDriveType的文档,它说我们应该使用它,我引用:

要确定驱动器是否为USB类型驱动器,请调用SetupDiGetDeviceRegistryProperty并指定SPDRP_Removing_策略属性

我做了一些测试,没有发现任何迹象表明某个设备是USB驱动器。
SPDRP\u remove\u POLICY
为许多设备(以及我的USB驱动器)返回2,因此我不能真正使用它。使用
SPDRP\u功能调用
SetupDiGetDeviceRegistryProperty
和仅过滤
CM\u DEVCAP\u remove
也会提供许多设备(即使与删除策略结合使用,也不能很好地指示如何找到我的USB驱动器。 另外,使用
SPDRP_DEVTYPE
调用
SetupDiGetDeviceRegistryProperty
总是返回错误13(“数据无效”),我不知道为什么

下面是一些代码:

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;
    }
}
无效设置信息()
{
HDEVINFO HDEVINFO=SetupDiGetClassDevsW(NULL,NULL,NULL,DIGCF_PRESENT | DIGCF_ALLCLASSES);
if(无效的\u句柄\u值==