- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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 的包装器):
我在这里没有选择......你能推荐一个替代方案来为连接到在 Windows XP 上运行的计算机的相机提供以下功能吗?
最佳答案
Microsoft 声称在安装了 WMP11 的 XP 上支持 WPD 和 MTP,事实确实如此!
然而,默认情况下,在 XP 上,相机设备很可能会加载 PTP 驱动程序堆栈。您可以通过查看“设备管理器”、“属性”、“驱动程序”选项卡中的“驱动程序详细信息”页面来检查这一点,您应该在其中看到:
也就是说,除非您的相机供应商为您在 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。然后:
现在在设备管理器中,您应该会看到相机设备已从“成像设备”中移出,现在显示在“可移植设备”下。此外,在驱动程序详细信息中,您应该会看到以下文件,表明正在使用通用 WPD MTP 类驱动程序(而不是之前的 PTP):
您现在应该能够使用 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/
我应该编写一个函数来打印一组给定的三个数字中两个较大数字的平方和。 我对这种情况的处理相当笨拙。我没有编写返回一组 3 中最大的两个数字的函数,而是编写了函数,以便表达式减少到两个所需的数字。 # S
如果有人可以提供帮助,我将不胜感激。我一直在敲我的头一天试图让这个工作。我已经在互联网上搜索并重新阅读了手册,但我就是不明白。 guile << __EOF__ ( define heading-li
目前我正在处理一个方案问题,其中我们正在使用方案列表表示一个图。我们使用的第一个变体是表示为 的边列表图 '((x y) (y z) (x z)) 我们正在使用的图的第二个变体被称为 x 图,表示为
我正在尝试创建一个函数,该函数将两个函数作为参数并执行它们。 我尝试使用 cond ,但它只执行 action1 . (define seq-action (lambda (action1 act
我提前为我的原始英语道歉;我会尽量避免语法错误等。 两周前,我决定更新我对 Scheme(及其启示)的知识,同时实现我在手上获得的一些数学 Material ,特别是我注册的自动机理论和计算类(cla
Scheme中有没有函数支持分数的“div”操作? 意思是 - 11 格 2.75 = 4。 最佳答案 我认为你的问题的答案是:没有,但你可以定义它: #lang racket (define (di
我在scheme中实现合并排序,我必须通过定义两个辅助方法来实现:merge和split。 Merge 需要两个列表(已经按递增顺序)并将它们合并在一起。我这样做了如下: (define merge
尝试从终端加载方案文件。我创建了一个名为 test.scm 的文件,其中包含以下代码: (define (square x) (* x x)) (define (sum-of-squares x y)
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我有点了解如何将基本函数(例如算术)转换为Scheme中的连续传递样式。 但如果函数涉及递归怎么办?例如, (define funname (lambda (arg0 arg1)
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
这个问题已经有答案了: How do I pass a list as a list of arguments in racket? (2 个回答) 已关闭 8 年前。 我有一个函数,它需要无限数量的
我对这段代码的工作方式感到困惑: (define m (list 1 2 3 '(5 8))) (let ((l (cdr m))) (set! l '(28 88))) ==>(1 2 3 (5 8
我正在为学校做一项计划作业,有一个问题涉及我们定义记录“类型”(作为列表实现)(代表音乐记录)。 我遇到的问题是我被要求创建一个过程来创建这些记录的列表,然后创建一个将记录添加到该列表的函数。这很简单
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
如何使用抽象列表函数(foldr、foldl、map 和 filter 编写函数),无需递归,消耗数字列表 (list a1 a2 a3 ...) 并产生交替和 a1 - a2 + a3 ...? 最
我试图找出在 Scheme 中发生的一些有趣的事情: (define last-pair (lambda (x) (if (null? (cdr x))
这个问题在这里已经有了答案: Count occurrence of element in a list in Scheme? (4 个答案) 关闭 8 年前。 我想实现一个函数来计算列表中元素出现
我正在尝试使用下面的代码获取方案中的导数。谁能告诉我哪里出错了?我已经尝试了一段时间了。 (define d3 (λ (e) (cond ((number? e) 0) ((e
我是一名优秀的程序员,十分优秀!