Альтернативы WPD / WIA в Windows XP? - PullRequest
4 голосов
/ 25 мая 2010

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

Проблема с WPD:

IPortableDeviceManager.GetDevices вызов не находит никаких устройств в 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 Ответ

8 голосов
/ 15 февраля 2011

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-разрядном режиме без изменений кода.

...