2010-05-25 84 views
4

WPD在Windows XP(SP1无法正常工作)时无法正常工作,即使Microsoft states it doesWindows XP上WPD/WIA的替代品?

问题与WPD:

IPortableDeviceManager.GetDevices呼叫没有找到在Win XP的任何设备,同时发现在Windows上的所有连接的摄像机7.

其他几个人没有工作的人与WPD同样的问题在XP中,无解: 1 2

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

问题的WIA自动化/ WIA接口:用相机进行交互时

  • WIA automation只提供愚蠢的对话 - 我需要,而做到这一点,从代码
  • WIA interfaces规划建议,以实现较低的水平WIA的任务。我还没有发现任何样品如何使用WIA接口从C#(也发现一些迹象表明,这是不可能的,在所有或至少very hard to do

因此我已经看过WIA 2.0(约wiaaut.dll包装):

  • 我在Win XP获得HRESULT 0x80210006(WIA_ERROR_BUSY)首次然后HRESULT E_FAIL所有的时间,而在Windows 7中相同的代码工作没有问题。

我要离开这里选择... 你能推荐别的选择,以提供连接到在Windows XP下运行的电脑摄像头以下特点?

  • 发送一个拍摄照片
  • 允许从相机

回答

8
是WPD和MTP与WMP11支持XP

微软要求安装下载最新拍摄的照片的通知,确实这是事实!

但是,默认情况下,在XP上,相机设备很可能会加载PTP驱动程序堆栈。

  • C:\ Windows \ System32下\ ptpusb.dll
  • C:\ Windows \ System32下,您可以通过查看设备管理器,属性,驱动程序选项卡,驱动程序详细信息页面,在这里你会看到这个检查\ ptpusd.dll

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

但是,创建自己的自定义INF以启用MTP相对比较容易,并且在“为MTP设备提供自定义INF文件”一节的mtpdev.chm帮助文件中的Microsoft Media Transfer Protocol Porting Kit中给出了相关的详细信息。

但是细节似乎有几分不完整的,并且有进一步的消息将有大约在C的注释所需的部分:与Windows Media Player 11安装\ 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 
;; 
;;****************************************************************************** 

例如,对于一个尼康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" 

为了支持不同的设备改变,或者用正确的PID和VID添加额外的项,在[尼康]部分为您的设备。您可以通过从下拉菜单中选择“Hadrware Ids”在“详细信息”选项卡的“设备管理器”中找到这些信息。如果您的相机来自不同的制造商,您可能还需要更改所有对“尼康”的参考。

一旦在记事本中创建了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

上述解决方案允许您使用通用Windows API通过Windows 7在32位或64位工作的通用API来构建应用程序,而不需要更改代码。

+0

非常感谢您的详细解答。肯定会提供一些非常有价值的见解。即使在我的情况下不可行(对于最终用户而言工作量太大),并且在此期间我已经设法让WIA在XP上工作,但非常感谢您的答复! – Marek 2011-02-16 06:47:33

+0

你是如何设法让WIA在XP上工作的? – 2011-09-14 19:51:51

+0

这真的很有帮助!感谢一百万次。它现在就像一个魅力 – giZm0 2011-10-27 09:16:07