Je souhaite répertorier les clés USB dans ma machine. Comment le faire dans VC++. Pouvez-vous donner un exemple de code.Liste des lettres de lecteur USB dans VC++
Répondre
Je ne pense pas que vous allez avoir quelqu'un pour écrire le code pour vous: vous êtes un programmeur, c'est (vraisemblablement) votre travail. Toutefois, vous pouvez commencer par GetLogicalDriveStrings et GetDriveType.
Selon la documentation de GetDriveType il dit que nous devrions utiliser SetupDiGetDeviceRegistryProperty pour, et je cite:
Pour déterminer si un lecteur est un lecteur USB de type, appelez SetupDiGetDeviceRegistryProperty et spécifiez la propriété SPDRP_REMOVAL_POLICY.
j'ai couru quelques tests et n'a pu trouver aucune indication d'un certain dispositif étant une clé USB. SPDRP_REMOVAL_POLICY renvoie 2 pour de nombreux périphériques (ainsi que mes clés USB), donc je ne peux pas vraiment l'utiliser. Appeler SetupDiGetDeviceRegistryProperty avec SPDRP_CAPABILITIES et filtrer seulement CM_DEVCAP_REMOVABLE donne aussi beaucoup de périphériques (même si la combinaison avec la politique de suppression ne donne pas une bonne indication de la façon de trouver mes clés USB.) En outre, appeler SetupDiGetDeviceRegistryProperty avec SPDRP_DEVTYPE renvoie toujours une erreur 13 ("Les données sont . invalide ") et je ne sais pas pourquoi
est ici un code.
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 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; } }