如何枚举MTP和PTP设备

时间:2017-08-17 10:55:41

标签: delphi delphi-xe7 mtp wpd ptp

This answer解释了如何使用WMI通过驱动器号查找连接的USB大容量存储设备,但我试图找到连接MTP或PTP设备(或连接的摄像头或移动设备)的名称(或UNC路径)安装没有驱动器号的设备,以便我可以抓取他们的目录来搜索图像。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

首先,您需要了解具有MTP设备名称将不允许您抓取目录或使用您用于简单PC文件系统的方法搜索图像。它只是Windows资源管理器的简化视图,而不是真正的状态。

我不知道Delphi是如何做到这一点的,但是有一个Windows Portable Devices API并且它都使用COM,所以我认为有一种方法可以让它在Delphi上运行。

您可以尝试的另一种方法是使用libmtp它是一个简单的C库,您可以使用一些帮助程序代码来定义can call来自Delphi的dll方法。

如果您只想要名称,可以使用SetupDiGetDeviceRegistryProperty WinApi函数找到附加的WPD设备的名称(Windows便携设备,它们使用的是MTP和PTP协议)。

首先,您需要使用GUID_DEVINTERFACE_WPD调用SetupDiGetClassDevs(它在PortableDevice.h中定义,但您可以在Google中轻松找到它 {6AC27878-A6FA-4155-BA85-F98F491D4F33})

然后使用SetupDiEnumDeviceInfo迭代设备,使用CM_Get_Device_ID函数调用从WPD导管获取每个设备的id,并使用SPDRP_FRIENDLYNAME(或SPDRP_DEVICEDESC,或者您应该尝试不同的参数)将其传递给SetupDiGetDeviceRegistryProperty

有很多使用此功能的示例,例如: SetupDiGetDeviceProperty usage example