我使用 SetupDiGetClassDevs 函数从系统中获取设备列表 - MSDN。
我还可以从设备中获取供应商 ID 和产品 ID。
但是获取不到盘符和挂载路径
例如,如果我插入 USB 驱动器意味着,我必须获得像“G:/”这样的驱动器号
请帮我获取设备的盘符和挂载路径
if (SetupDiEnumDeviceInterfaces(hDevInfo,
NULL,&GUID_DEVINTERFACE_USB_DEVICE,i,&Interface_Info))
{
wprintf(L"\tDeviccvcvcveInstanceId : %d\n", i);
pspdidd->cbSize = sizeof(*pspdidd);
SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;
DWORD dwDetDataSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;
pDetData = (SP_DEVICE_INTERFACE_DETAIL_DATA*) malloc (dwDetDataSize);
pDetData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
SetupDiGetDeviceInterfaceDetail(hDevInfo,&Interface_Info,pDetData,dwDetDataSize,
NULL,&DeviceInfoData);
qDebug ()<<QString::fromWCharArray( pDetData->DevicePath );
}
最佳答案
没那么简单。您不能调用任何会告诉您的 API:“设备 X = 驱动器 Y”。那是因为这种关系不是一对一的;它是多对多的。
一个盘符对应一个卷。驱动器盘符是一个挂载点。您还可以在目录重新分析点安装一个卷 - 可以多次安装同一卷。
单个设备可以容纳多个卷(例如磁盘分区)。这很常见。
单个卷可以驻留在多个设备上(例如跨区驱动器)。是的,卷驻留在单个设备的单个分区上很常见,但情况不一定如此。
另请注意,根本不必为卷分配挂载点(考虑您经常在 Windows 7 启动驱动器上看到的 100MB EFI 分区)。
一种方法是通过 GUID (FindFirstVolume/FindNextVolume) 枚举卷,然后通过 IOCTL (IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS) 获取它们的磁盘范围。这将告诉您包含部分卷的磁盘编号。然后使用 GetVolumePathNamesForVolumeName 获取卷的挂载点(可能最多有一个盘符,但可以挂载在多个目录下)。
是的,真的有那么复杂。
关于c++ - 如何获取驱动器号和装载路径 - MSDN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980240/