【问题标题】:Alternatives to WPD/WIA on Windows XP?Windows XP 上 WPD/WIA 的替代方案?
【发布时间】:2023-03-31 07:15:02
【问题描述】:

WPD 无法在 Windows XP(SP1,如果这很重要)上正常工作,即使 Microsoft states it does

WPD 的问题:

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

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

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

WIA 自动化/WIA 接口的问题:

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

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

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

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

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

【问题讨论】:

    标签: c# .net windows-xp wia wpd


    【解决方案1】:

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

    但是默认情况下,在 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 中给出。

    然而,那里的细节似乎有些不完整,还有关于随 Windows Media Player 11 安装的 C:\Windows\Inf\WpdMtp.inf 的 cmets 中所需部分的进一步信息:

    ;;******************************************************************************
    ;; 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。您可以通过从下拉列表中选择“硬件 ID”在“详细信息”选项卡上的“设备管理器”中找到这些。如果您的相机来自不同的制造商,您可能还需要更改对“尼康”的所有引用。

    在记事本中创建 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 上运行,无需更改代码。

    【讨论】:

    • 非常感谢您的详细解答。绝对为这个问题提供了一些非常有价值的见解。即使这在我的场景中不可行(对最终用户来说工作量太大),同时我已经设法让 WIA 在 XP 上运行,非常感谢您的回答!
    • 这真的很有帮助!感谢一百万次。它现在就像一个魅力
    • 我们询问了供应商,他们非常乐于助人,并提供了支持 xp 设备的 .inf 文件。
    • 如何下载 XP 的 sdk?它声称它现在已经全部集成到 Windows SDK 中,它只有 vista、server 和 7 的版本
    猜你喜欢
    • 2012-06-13
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2010-10-30
    相关资源
    最近更新 更多