Альтернативы 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-битном режиме без изменений кода.