2015-09-22 4 views
0

J'ai créé un programme en utilisant l'API Windows qui détecte l'insertion de certains médias (cd, usb ...). Le programme retourne le chemin du périphérique:Obtention du nom de volume à partir du chemin de périphérique sur les périphériques USB

\\\\?\\usb#vid_vvvv&pid_pppp#aaaaaaaaaaaaaaaa#{gggggggg-gggg-gggg-gggg-gggggggggggg}

J'utilise la fonction GetVolumeNameForVolumeMountPoint pour obtenir le nom du volume en analysant le chemin d'interface de l'appareil comme indiqué here, mais il semble que cette fonctionnalité ne fonctionne pas pour les périphériques USB.

Une idée de la façon d'obtenir le nom du volume à partir du chemin de périphérique en cas de travail avec des périphériques USB?

Répondre

2
//First get GUID 
`guid = GUID_DEVINTERFACE_VOLUME` 
//and get handle for Device information. 

`hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT); // Get device Information handle for Volume interface ` 

//After that loop through SetupDiEnumDeviceInterfaces() and you will get the usb drive storage volume path 

    for(dwIndex = 0; ;dwIndex ++) // Loop until device interfaces are found. 
    { 
     ZeroMemory(&devInterfaceData, sizeof(devInterfaceData)); 
     devInterfaceData.cbSize = sizeof(devInterfaceData); 

     if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid,dwIndex,&devInterfaceData))// Get device Interface data. 
     { 
      break; 
     } 
     ZeroMemory(&devInfoData, sizeof(devInfoData)); 
     devInfoData.cbSize = sizeof(devInfoData); 

     pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer; 
     pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 



     SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,pDevDetail,BUFFER_SIZE,&dwRequiredSize,&devInfoData); // SP_DEVINFO_DATA 

     CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0); // Get the device instance of parent. This points to USBSTOR. 
     CM_Get_Device_ID(devInstParent, buf, BUFFER_SIZE,0); 

nLength = strlen(pDevDetail->DevicePath); 
      pDevDetail->DevicePath[nLength] = '\\'; 
      pDevDetail->DevicePath[nLength+1] = 0; 

if(GetVolumeNameForVolumeMountPoint(pDevDetail->DevicePath, volume,BUFFER_SIZE)) 
      { 
//Here you will get the volume corresponding to the usb 
} 
+0

J'ai réussi à le faire fonctionner il y a quelques mois mais cette solution fonctionne bien aussi, et mieux optimisée que la mienne. Merci. – Finfa811

+0

De rien –