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 的替代品? 的相关文章

  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • .NET 图形重影

    我正在为我们正在开发的新应用程序制作一个示例 GUI 我已经决定了语言 但我可以使用任何第 3 方 DLL 或插件或任何我需要的东西 以使 GUI 尽可能无缝地工作 他们希望它非常像 mac ubuntu vista Windows 7 所
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 使用32位应用程序获取syswow64目录

    我正在尝试在系统目录中查找文件 问题是当使用 Environment SystemDirectory 在 x64 计算机上 我仍然获得 System32 目录 而不是 Systemwow64 目录 我需要在 x86 机器上获取 System
  • 为什么 MISRA:2012 需要函数原型?

    我想知道为什么 MISRA 2012 需要函数原型 在下面的示例中 这两个原型并不是真正必要的 include
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He

随机推荐