qui suit un code modifié Litle
#include <Windows.h>
#include <setupapi.h>
#include <cfgmgr32.h>
#include <tchar.h>
#include <stdio.h>
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
#pragma comment (lib, "setupapi.lib")
int main()
{
HDEVINFO hDevInfo;
GUID guid;
BYTE buffer[ 1024 ];
DWORD dwRequiredSize ;
DEVINST devInstParent;
SP_DEVICE_INTERFACE_DATA devInterfaceData;
SP_DEVINFO_DATA devInfoData;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail;
CONFIGRET status;
TCHAR szDeviceInstanceID [MAX_DEVICE_ID_LEN];
BOOL bSuccess;
guid = GUID_DEVINTERFACE_VOLUME;
hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if(hDevInfo == INVALID_HANDLE_VALUE) {
return 1;
}
for(DWORD dwIndex = 0;; dwIndex ++) {
ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
devInterfaceData.cbSize = sizeof(devInterfaceData);
if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &devInterfaceData)) {
DWORD dwErrorCode = GetLastError();
if (dwErrorCode == ERROR_NO_MORE_ITEMS)
break;
else
return 1; // ERROR!!!
}
ZeroMemory(&devInfoData, sizeof(devInfoData));
devInfoData.cbSize = sizeof(devInfoData);
pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// Get device interface detail data to get Device Instance from
// SP_DEVINFO_DATA and Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA
bSuccess = SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,
pDevDetail,// SP_DEVICE_INTERFACE_DETAIL_DATA
sizeof(buffer),&dwRequiredSize,&devInfoData); // SP_DEVINFO_DATA
status = CM_Get_Device_ID (devInfoData.DevInst, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0);
if (status == CR_SUCCESS) {
_tprintf (TEXT("%s\n"), szDeviceInstanceID);
}
status = CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0);
if (status == CR_SUCCESS) {
status = CM_Get_Device_ID (devInstParent, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0);
if (status == CR_SUCCESS)
_tprintf (TEXT(" %s\n"), szDeviceInstanceID);
status = CM_Get_Parent(&devInstParent,devInstParent, 0);
if (status == CR_SUCCESS) {
status = CM_Get_Device_ID( devInstParent, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0);
if (status == CR_SUCCESS) {
_tprintf (TEXT(" %s\n"), szDeviceInstanceID);
}
}
else {
continue;
}
}
else {
continue;
}
}
}
travail sans aucun problème sur mon ordinateur Windows 7 et produire une sortie comme suit:
SCSI\CDROM&VEN_ELBY&PROD_CLONEDRIVE&REV_1.4\1&2AFD7D61&0&000000
ROOT\SCSIADAPTER\0000
HTREE\ROOT\0
STORAGE\VOLUME\{21C004DA-0EB2-11DF-8C02-806E6F6E6963}#0000000000100000
ROOT\VOLMGR\0000
HTREE\ROOT\0
STORAGE\VOLUME\{21C004DA-0EB2-11DF-8C02-806E6F6E6963}#000000004B100000
ROOT\VOLMGR\0000
HTREE\ROOT\0
STORAGE\VOLUME\{21C004DA-0EB2-11DF-8C02-806E6F6E6963}#00000037C7A00000
ROOT\VOLMGR\0000
HTREE\ROOT\0
MISE À JOUR basé sur le commentaire: Le mon Windows XP dans le même utilitaire VMware produire la sortie suivante
FDC\GENERIC_FLOPPY_DRIVE\6&1435B2E2&0&0
ACPI\PNP0700\5&324D5432&0
ACPI\PNP0A05\4&5289E18&0
IDE\CDROMNECVMWAR_VMWARE_IDE_CDR10_______________1.00____\3031303030303030303030303030303030303130
PCIIDE\IDECHANNEL\4&23686003&0&1
PCI\VEN_8086&DEV_7111&SUBSYS_197615AD&REV_01\3&61AAA01&0&39
STORAGE\VOLUME\1&30A96598&0&SIGNATURE91929192OFFSET7E00LENGTH1FFD5AA00
ROOT\FTDISK\0000
HTREE\ROOT\0
Cause C'est un autre ordinateur (un ordinateur virtuel) sur l'autre système d'exploitation et nous recevons une autre liste de périphériques. Votre question actuelle était de faire fonctionner la fonction CM_Get_Parent()
sur Windows XP et Windows 7. Le code affiché fait cela comme nous pouvons le voir. Ou il fonctionne maintenant correctement sur votre ordinateur Windows XP ou Windows 7?
Comment obtenir pid et vid (id produit et id Ventor) je l'ai décrit dans Get information about disk drives result on windows7 - 32 bit system, mais pour toutes les lettres de lecteur et non pour les appareils de volume . On peut facilement changer le code pour afficher plus d'informations comme le nom du volume, le nom du bus et d'autres informations. Mais tout cela est déjà une autre question.
MISE À JOUR: J'ai placé la version étendue du programme de Get information about disk drives result on windows7 - 32 bit system sous http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.c en raison de la restriction de la taille du message dans stackoverflow.com. La sortie du test ressemble à http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.txt
Il y a quelque temps, je vous ai posté un exemple de code sur http://stackoverflow.com/questions/3098696/how-to-get-the-vid-pid-and-drive-letter-for -tout-le-usb-mass-storage-devices-plug qui utilise 'CM_Get_Parent' et que j'ai testé sous Windows 7. Donc si vous avez un exemple où la fonction' CM_Get_Parent() 'ne fonctionne pas, vous devriez poster l'exemple de code correspondant peut être utilisé pour reproduire le problème. – Oleg