2015-09-22 72 views
0

我已经构建了一个使用检测某些媒体(cd,usb ...)的插入的Windows API的程序。该程序返回的设备路径:从USB设备的设备路径获取卷名称

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

我使用的功能GetVolumeNameForVolumeMountPoint通过解析设备接口路径报道here获得卷名,但似乎这个功能不能正常使用USB设备。

在使用USB设备的情况下,如何从设备路径获取卷名的任何想法?

回答

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

几个月前,我设法让它工作,但该解决方案运行良好,并且比我的优化更好。谢谢。 – Finfa811

+0

欢迎您 –