Windows XP 上 WPD/WIA 的替代品?

2024-04-13

WPD http://www.microsoft.com/whdc/device/wpd/default.mspx在 Windows XP(SP1,如果重要的话)上无法正常工作,即使微软表示确实如此 http://msdn.microsoft.com/en-us/library/dd388998(v=VS.85).aspx.

WPD 问题:

IPortableDeviceManager.GetDevicescall 在 Win XP 上找不到任何设备,而在 Windows 7 上却找到所有连接的摄像机。

其他一些人也遇到了同样的问题,WPD 无法在 XP 上运行,没有解决方案:1 http://us.generation-nt.com/wpd-can-not-work-windows-xp-help-30545902.html 2 http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/56459945-b757-45df-8c9f-4ebdbbb18a2c

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

WIA 自动化/WIA 接口问题:

  • WIA automation与相机交互时仅提供愚蠢的对话框 - 我需要通过代码来完成此操作
  • 编程针对WIA interfaces建议使用 WIA 来完成较低级别的任务。我还没有找到任何如何从 C# 使用 WIA 接口的示例(还发现一些迹象表明这根本不可能或至少不可能)很难做到 http://bytes.com/topic/c-sharp/answers/261281-error-while-implementing-interface)

因此我研究了 WIA 2.0(wiaut.dll 的包装):

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

我在这里失去了选择......您能否推荐一种替代方案,为连接到运行 Windows XP 的计算机的相机提供以下功能?

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

微软声称在安装了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 上运行的应用程序,而无需更改代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows XP 上 WPD/WIA 的替代品? 的相关文章

  • 如何将智能感知添加到我的应用程序中?

    我们的一款产品拥有一种专有的宏语言 通过我们的 Windows 软件进行编辑 我想添加智能感知 但我不知道如何去做 至少不完全重新发明轮子 是否有任何示例代码或第 3 方包至少可以让我开始 它不一定是免费的 该应用程序使用 NET 用 C
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 如何启动异步任务对象

    我想开始收集Task同时处理对象并等待所有对象完成 下面的代码显示了我想要的行为 public class Program class TaskTest private Task createPauseTask int ms works w
  • 代码块 power 函数在 c 中不起作用

    我正在使用代码块来学习c 我的代码是 include
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • 如何填充两个样条线或直线系列之间的区域

    我有这个Chart 如何填充两个之间的区域Series S0 and S1 说蓝色和黄色Series 为此 我们编写了其中之一Paint事件 这里的ValueToPixelPosition https msdn microsoft com
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 按值返回的函数的返回语句中的初始化

    我的问题源于深入研究std move in return语句 例如以下示例 struct A A std cout lt lt Constructed lt lt this lt lt std endl A A noexcept std c
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐