Альтернативы WPD/WIA в Windows XP?

WPD не работает должным образом в Windows XP (SP1, если это имеет значение), даже если Microsoft заявляет, что это работает.

Проблема с WPD:

IPortableDeviceManager.GetDevices call не находит никаких устройств в Win XP, а находит все подключенные камеры в Windows 7.

Несколько других людей имели такую ​​же проблему с WPD, не работающим на XP, нет решения: 1 2

Я решил переопределить функциональность с помощью WIA.

Проблема с автоматикой WIA / интерфейсами WIA:

  • WIA automation предлагает только глупые диалоги при взаимодействии с камерой - мне нужно скорее сделать это из кода
  • Программирование против WIA interfaces рекомендуется для достижения задач более низкого уровня с WIA. Я не нашел примеров того, как использовать интерфейсы WIA из C# (также было обнаружено, что это вообще невозможно или, по крайней мере, очень сложно сделать)

Таким образом я посмотрел на WIA 2.0 (обертка вокруг wiaaut.dll):

  • Я получаю HRESULT 0x80210006 (WIA_ERROR_BUSY) в первый раз, а затем HRESULT E_FAIL все время на Win XP, в то время как на Windows 7 один и тот же код работает без проблем.

Я выбираю варианты здесь... Можете ли вы порекомендовать альтернативу для предоставления следующих функций для камер, подключенных к компьютеру, который работает в Windows XP?

  • отправляет уведомление о том, что была сделана фотография
  • позволяет загрузить недавно снятый снимок с камеры

1 ответ

Microsoft утверждает, что WPD и MTP поддерживаются в XP с установленным WMP11, и это действительно так!

Однако по умолчанию в XP устройство камеры, скорее всего, будет загружать стек драйверов PTP. Вы можете проверить это, посмотрев страницу "Сведения о драйвере" в Диспетчере устройств, Свойства, вкладка "Драйвер", где вы должны увидеть:

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

То есть, если поставщик вашей камеры не предоставил вдумчивый WPD-совместимый INF-файл для вашего устройства в XP. У большинства нет, вероятно, из-за зависимости от WMP10/11.

Однако создать собственный настраиваемый INF-файл для включения MTP относительно просто, и подробности об этом приведены в пакете портирования протокола передачи мультимедиа Microsoft в файле справки mtpdev.chm в разделе "Предоставление настраиваемого INF-файла для устройства MTP".

Однако детали там кажутся несколько неполными, и есть дополнительная информация о разделах, необходимых в комментариях к C:\Windows\Inf\WpdMtp.inf, установленному с 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
;;
;;******************************************************************************

Например, для 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" в раскрывающемся списке. Возможно, вы также захотите изменить все ссылки на "Nikon", если ваша камера от другого производителя.

Создав INF-файл в блокноте, сохраните его под соответствующим именем, например, NikonD90.INF. Затем:

  • В диспетчере устройств Windows щелкните правой кнопкой мыши устройство камеры и выберите "Обновить драйвер".
  • Выберите "Нет, не в этот раз", когда Windows попросит выполнить поиск в Центре обновления Windows.
  • Выберите "Установить из списка или определенного места (Дополнительно)".
  • Выберите "Не искать, я выберу диск для установки".
  • Нажмите "Есть диск".
  • Нажмите "Браузер" и перейдите в папку, в которой вы сохранили созданный выше INF-файл.
  • Выберите файл INF, и он должен установить драйверы MTP.

Теперь в Диспетчере устройств вы должны увидеть, что устройство камеры переместилось из "Устройства обработки изображений" и теперь отображается вместо "Переносные устройства". Также в деталях драйвера вы должны увидеть следующие файлы, указывающие на то, что используются драйверы универсального класса WPD MTP (вместо PTP ранее):

  • C: \ Windows \ System32 \ wpdusb.dll
  • C: \ Windows \ System32 \ wudfrd.dll

Теперь вы сможете успешно перечислять ваше устройство MTP с помощью IPortableDeviceManager.GetDevices и использовать все другие функции API для отправки пользовательских команд MTP. Посмотрите сообщения MSDN dimeby8 для деталей.

Вышеупомянутое решение позволяет вам создавать приложения с общим API, которые работают в Windows XP через Windows 7 в 32- или 64-битном режиме без изменений кода.

Другие вопросы по тегам