gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:36:05 25 4
gpt4 key购买 nike

WPD在 Windows XP(如果重要的话是 SP1)上不能正常工作,即使 Microsoft states it does .

WPD 问题:

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

其他一些人遇到了同样的问题,WPD 不能在 XP 上运行,没有解决方案: 1 2

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

WIA 自动化/WIA 接口(interface)问题:

  • WIA 自动化 在与相机交互时仅提供愚蠢的对话框 - 我需要从代码中执行此操作
  • 建议针对 WIA 接口(interface) 进行编程,以使用 WIA 完成较低级别的任务。我还没有找到任何示例如何从 C# 使用 WIA 接口(interface)(还发现一些迹象表明这根本不可能或至少不可能 very hard to do )

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

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

我在这里没有选择......你能推荐一个替代方案来为连接到在 Windows XP 上运行的计算机的相机提供以下功能吗?

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

最佳答案

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

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

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

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

然而,创建您自己的自定义 INF 以启用 MTP 相对容易,有关这方面的详细信息在 Microsoft Media Transfer Protocol Porting Kit 中给出。在“为 MTP 设备提供自定义 INF 文件”部分下的 mtpdev.chm 帮助文件中。

但是那里的细节似乎有些不完整,关于 C:\Windows\Inf\WpdMtp.inf installed with Windows Media Player 11 的注释中所需的部分还有更多信息:

;;******************************************************************************
;; 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"

要支持不同的设备更改或添加其他项目,请在 [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 命令。查看MSDN posts by dimeby8了解详情。

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

关于c# - Windows XP 上 WPD/WIA 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2905921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com