微软声称在安装了WMP11的XP上支持WPD和MTP,事实确实如此!
然而,默认情况下,在 XP 上,相机设备很可能会加载 PTP 驱动程序堆栈。您可以通过查看“设备管理器”、“属性”、“驱动程序”选项卡中的“驱动程序详细信息”页面来检查这一点,您应该在其中看到:
- C:\Windows\System32\ptpusb.dll
- C:\Windows\System32\ptpusd.dll
也就是说,除非您的相机供应商精心为您的 XP 设备提供了自定义的 WPD 兼容 INF 文件。大多数都没有,可能是由于对 WMP10/11 的依赖。
然而,创建您自己的自定义 INF 来启用 MTP 相对容易,详细信息在Microsoft 媒体传输协议移植套件 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a2e73160-e862-4f19-bb26-c0cafe798955在 mtpdev.chm 帮助文件的“为 MTP 设备提供自定义 INF 文件”部分下。
然而,那里的细节似乎有些不完整,关于与 Windows Media Player 11 一起安装的 C:\Windows\Inf\WpdMtp.inf 的注释中所需的部分,还需要进一步的信息:
;;******************************************************************************
;; The following are to be used in vendor specific "Includes" and "Needs" sections.
;; Specifically, the INF should contain:
;;
;; [DDInstall]
;; Include = wpdmtp.inf
;; Needs = WPD.MTP
;;
;; [DDInstall.hw]
;; Include = wpdmtp.inf
;; Needs = WPD.MTP.Registration <- includes all default legacy API and autoplay registration for the device
;; - OR -
;; Needs = WPD.MTP.RegistrationBasic <- only do minimum registration, no legacy API or autoplay
;;
;; [DDInstall.Services]
;; Include = wpdmtp.inf
;; Needs = WPD.MTP.Services
;;
;; [DDInstall.CoInstallers]
;; Include = wpdmtp.inf
;; Needs = WPD.MTP.CoInstallers
;;
;; [DDInstall.Wdf]
;; Include = wpdmtp.inf
;; Needs = WPD.MTP.Wdf
;; UmdfServiceOrder=WpdMtpDriver
;;
;;******************************************************************************
例如,对于 Nikon D90,可以创建以下 INF 文件:
[Version]
Signature="$WINDOWS NT$"
Class=WPD
ClassGUID={EEC5AD98-8080-425f-922A-DABF3DE3F69A}
Provider=%Provider%
DriverVer=02/22/2006,5.2.5326.4762
[Manufacturer]
%MfgName%=Nikon
[Nikon]
%Nikon.DeviceDesc%=Nikon_MTP, USB\VID_04B0&PID_0421
[Nikon_MTP]
Include = wpdmtp.inf
Needs = WPD.MTP
[Nikon_MTP.hw]
Include = wpdmtp.inf
Needs = WPD.MTP.RegistrationBasic
[Nikon_MTP.Services]
Include = wpdmtp.inf
Needs = WPD.MTP.Services
[Nikon_MTP.CoInstallers]
Include = wpdmtp.inf
Needs = WPD.MTP.CoInstallers
[Nikon_MTP.Wdf]
Include = wpdmtp.inf
Needs = WPD.MTP.Wdf
UmdfServiceOrder=WpdMtpDriver
[Strings]
Nikon.DeviceDesc = "Nikon D90 MTP Device"
MfgName = "Nikon"
Provider = "Nikon"
为了支持不同的设备,请在 [Nikon] 部分下更改或添加其他项目,并为您的设备添加正确的 PID 和 VID。您可以通过从下拉列表中选择“Hadrware Ids”,在“详细信息”选项卡上的“设备管理器”中找到这些信息。如果您的相机来自其他制造商,您可能还需要更改所有对“Nikon”的引用。
在记事本中创建 INF 文件后,以适当的名称保存,例如 NikonD90.INF。然后:
- 在 Windows 设备管理器中右键单击相机设备并选择“更新驱动程序”。
- 当 Windows 要求搜索 Windows 更新时,选择“否,这次不”。
- 选择“从列表或特定位置安装(高级)”。
- 选择“不搜索,我将选择要安装的驱动器”。
- 单击“从磁盘安装”。
- 单击“浏览器”并导航到保存上面创建的 INF 文件的文件夹。
- 选择 INF 文件,它应该安装 MTP 驱动程序。
现在,在设备管理器中,您应该看到相机设备已从“成像设备”移出,现在显示在“便携式设备”下。另外,在驱动程序详细信息中,您应该看到以下文件,表明正在使用通用 WPD MTP 类驱动程序(而不是以前的 PTP):
- C:\Windows\System32\wpdusb.dll
- C:\Windows\System32\wudfrd.dll
您现在应该能够使用 IPortableDeviceManager.GetDevices 成功枚举您的 MTP 设备,并使用所有其他 API 函数发送自定义 MTP 命令。请参阅dimeby8 的 MSDN 帖子 http://blogs.msdn.com/b/dimeby8/了解详情。
上述解决方案允许您使用通用 API 构建在 32 位或 64 位 Windows XP 到 Windows 7 上运行的应用程序,而无需更改代码。