Windows XP上WPD / WIA的替代方案?

时间:2010-05-25 15:09:29

标签: c# .net windows-xp wia wpd

WPD在Windows XP上无法正常运行(如果重要的话,SP1),即使是Microsoft states it does

WPD问题:

IPortableDeviceManager.GetDevices调用在Windows XP上找到所有连接的摄像头时,在Win XP上找不到任何设备。

其他一些人也有同样的问题,WPD没有在XP上工作,没有解决方案: 1 2

我决定使用WIA重新实现功能。

WIA自动化/ WIA接口出现问题:

  • WIA automation在与相机交互时只提供愚蠢的对话 - 我需要在代码中执行此操作
  • 建议针对WIA interfaces进行编程以使用WIA实现较低级别的任务。我没有找到任何样本如何使用C#的WIA接口(也发现一些迹象表明这根本不可能或至少very hard to do

因此我查看了WIA 2.0(围绕wiaaut.dll的包装):

  • 我第一次获得HRESULT 0x80210006(WIA_ERROR_BUSY),然后在Win XP上一直获得HRESULT E_FAIL,而在Windows 7上,相同的代码可以正常运行。

我在这里没有选择... 您是否可以推荐替代方案为连接到适用于Windows XP的计算机的摄像机提供以下功能?

  • 发送照片的通知
  • 允许从相机下载最近拍摄的照片

1 个答案:

答案 0 :(得分:8)

微软声称在安装了WMP11的XP上支持WPD和MTP,事实确实如此!

但是默认情况下,在XP上,相机设备很可能会加载PTP驱动程序堆栈。您可以通过查看“设备管理器”,“属性”,“驱动程序”选项卡中的“驱动程序详细信息”页面进行检查,您应该看到:

  • C:\ Windows \ System32下\ ptpusb.dll
  • C:\ Windows \ System32 \ ptpusd.dll

也就是说,除非您的相机供应商在XP上为您的设备提供了一个自定义的WPD兼容INF文件。大多数人没有,可能是由于对WMP10 / 11的依赖。

但是,创建自己的自定义INF以启用MTP相对容易,有关详细信息,请参阅mtpdev.chm帮助文件中的Microsoft Media Transfer Protocol Porting Kit下的“为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 ID”来查找这些内容。如果您的相机来自不同的制造商,您可能还想更改所有对“Nikon”的引用。

在记事本中创建INF文件后,请以适当的名称保存,例如NikonD90.INF。然后:

  • 在Windows设备管理器中,右键单击相机设备和“更新驱动程序”。
  • 当Windows要求搜索Windows Update时选择“不,不是这次”。
  • 选择“从列表或特定位置安装(高级)”。
  • 选择“不搜索,我会选择要安装的驱动器”。
  • 点击“从磁盘安装”。
  • 单击“浏览器”并导航到保存上面创建的INF文件的文件夹。
  • 选择INF文件,它应该安装MTP驱动程序。

现在,在设备管理器中,您应该看到相机设备已从“成像设备”移动,现在显示在“便携式设备”下。另外在驱动程序详细信息上,您应该看到以下文件,指示正在使用通用WPD MTP类驱动程序(而不是之前的PTP):

  • C:\ Windows \ System32下\ wpdusb.dll
  • C:\ Windows \ System32下\ wudfrd.dll

您现在应该能够使用IPortableDeviceManager.GetDevices成功枚举您的MTP设备,并使用所有其他API函数发送自定义MTP命令。有关详细信息,请参阅MSDN posts by dimeby8

上述解决方案允许您构建具有通用API的应用程序,该API可通过Windows 7以32位或64位在Windows XP上运行,无需更改代码。