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