Список букв USB-накопителя в VC++
Я хочу перечислить USB-накопители в моей машине. Как это сделать в VC++. Можете ли вы дать пример кода.
2 ответа
Я не думаю, что вы заставите кого-то писать код для вас: вы программист, это (предположительно) ваша работа.
Однако вы можете начать с GetLogicalDriveStrings и GetDriveType.
Согласно документации GetDriveType говорится, что мы должны использовать SetupDiGetDeviceRegistryProperty, и я цитирую:
Чтобы определить, является ли диск USB-накопителем, вызовите SetupDiGetDeviceRegistryProperty и укажите свойство SPDRP_REMOVAL_POLICY.
Я провел несколько тестов и не смог найти никаких признаков того, что определенное устройство является USB-накопителем.SPDRP_REMOVAL_POLICY
возвращает 2 для многих устройств (а также для моих USB-накопителей), поэтому я не могу это использовать. призвание SetupDiGetDeviceRegistryProperty
с SPDRP_CAPABILITIES
и только фильтр CM_DEVCAP_REMOVABLE
также дает много устройств (даже в сочетании с политикой удаления не дает никаких хороших указаний, как найти мои USB-накопители. Кроме того, вызов SetupDiGetDeviceRegistryProperty
с SPDRP_DEVTYPE
всегда возвращает ошибку 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, ®DataType,
(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, ®DataType,
(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, ®DataType,
(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, ®DataType,
(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;
}
}