Альтернативы 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 рекомендуется программировать против WIA interfaces. Я не нашел примеров того, как использовать интерфейсы WIA из C # (также нашел некоторые признаки того, что это вообще невозможно или, по крайней мере, очень сложно сделать)

Итак, я посмотрел на WIA 2.0 (оболочка для wiaaut.dll):

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

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

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

person Marek    schedule 25.05.2010    source источник


Ответы (1)


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

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

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

То есть, если только поставщик вашей камеры не предоставил для вашего устройства на XP специальный файл INF, совместимый с WPD. Большинство этого не сделали, вероятно, из-за того, что полагались на 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 Ids» в раскрывающемся списке. Вы, вероятно, также захотите изменить все ссылки на «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-разрядной версии без изменения кода.

person pcbbc    schedule 15.02.2011
comment
Большое спасибо за подробный ответ. Определенно дает очень ценное понимание проблемы. Даже если в моем сценарии это невыполнимо (для конечного пользователя это было бы слишком много работы), а тем временем мне удалось заставить WIA работать на XP, мы очень ценим ваш ответ! - person Marek; 16.02.2011
comment
Это было действительно полезно! Спасибо миллион раз. Теперь это работает как шарм - person giZm0; 27.10.2011
comment
Мы спросили поставщика, и они были очень любезны и предоставили в виде файла .inf поддержку устройства на xp. - person giZm0; 17.01.2012
comment
Как вообще скачать sdk для XP? Он утверждает, что теперь все это включено в Windows SDK, который имеет версии только для Vista, Server и 7. - person Matt; 29.02.2012