Поделиться через


Передача данных между устаревшим приложением и драйвером Windows Vista

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

Как минимум, устаревший драйвер должен предоставлять как TYMED_FILE, так и TYMED_CALLBACK; однако драйвер Windows Vista никогда не будет предоставлять TYMED_CALLBACK (или TYMED_MULTIPAGE_CALLBACK). Часть передачи уровня совместимости обеспечит, что устаревшее приложение увидит TYMED_CALLBACK, хотя драйвер Windows Vista его не реализует. TYMED_MULTIPAGE_CALLBACK никогда не будет предоставляться драйвером Windows Vista.

Устаревшее приложение увидит форматы, поддерживаемые для TYMED_FILE и TYMED_MULTIPAGE_FILE, которые предоставляет драйвер Windows Vista. Для TYMED_CALLBACK устаревшее приложение будет видеть те же форматы, что и драйвер, предоставляемый для TYMED_FILE, за исключением одного исключения: вместо предоставления WiaImgFmt_BMP уровень совместимости будет предоставлять WiaImgFmt_MEMORYBMP устаревшему приложению. Это осуществляется за счет того, что слой совместимости "перехватывает" вызовы IWiaMiniDrv::drvGetWiaFormatInfo и добавляет все форматы TYMED_FILE драйвера Windows Vista (за исключением WiaImgFmt_BMP /WiaImgFmt_MEMORYBMP) для TYMED_CALLBACK. Важнее всего то, что уровень совместимости создает свой собственный объект обратного вызова для старых систем во время передачи данных, который преобразует сообщения передачи Windows Vista и данные, записанные в его поток, в сообщения передачи для старых систем.

Дополнительные сведения о константах TYMED см. в разделе "Общие сведения о TYMED".

Уровень совместимости создает два объекта обратного вызова в прокси-сервере WIA COM: один для передачи обратного вызова и один для передачи файлов. Прокси-сервер WIA COM реализует интерфейс IWiaTransferCallback. Этот объект обратного вызова отвечает за преобразование между передачей на основе потока и передачей старого стиля. Уровень совместимости WIA также запускает фильтр обработки изображений драйвера, которому передается объект обратного вызова уровня совместимости. Таким образом, фильтр обработки изображений всегда будет выполняться в контексте приложения так же, как и при передаче Windows Vista.

На следующей схеме показано, как уровень совместимости будет работать с драйвером Windows Vista и устаревшим приложением.

схема, демонстрирующая передачу данных между устаревшим приложением и драйвером Windows Vista.

Устаревший объект обратного вызова в прокси-сервере WIA COM преобразует сообщения передачи Windows Vista и данные, записанные в поток, в устаревшие сообщения передачи и записывает данные в файл или выполняет обратный вызов для данных с разбивкой на блоки.

Когда драйвер вызывает любой из методов, предоставляемых интерфейсом IStream , который он получает от метода IWiaMiniDrvTransferCallback::GetNextStream (обратите внимание, что драйвер должен вызывать только IStream::Write, IStream::Seek и IStream::SetSize). Таким образом, уровень совместимости создает пользовательскую реализацию IStream , которая просто упаковывает интерфейс IStream , который предоставляет прокси-сервер WIA COM.

Передачи наследуемых файлов просты. Пример такой передачи заключается в том, что устаревшее приложение вызывает IWiaDataTransfer::idtGetData. Уровень совместимости создает поток данных в файле, который приложение указывает в структуре STGMEDIUM. Этот поток передается драйверу или фильтру обработки изображений при вызове IWiaTransferCallback::GetNextStream и все сообщения передачи легко сопоставляются с устаревшими сообщениями передачи. Более подробное описание сопоставлений сообщений см. в статье о реализации передачи данных уровня совместимости WIA.

При вызове метода IWiaDataTransfer::d tGetData уровень совместимости выполняет более строгую проверку параметров. Например, уровень совместимости не позволяет вызывать метод IWiaDataTrasnfer::idtGetData с TYMED_FILE и число страниц выше, чем один в передаче данных, которые не используют уровень совместимости, можно было вызвать метод IWiaDataTrasnfer::idtGetData с TYMED_FILE и иметь число страниц больше, чем один.

Устаревшая обработка обратных вызовов немного сложнее. Так как драйвер Windows Vista не поддерживает WiaImgFmt_MEMORYBMP, который необходим для устаревших драйверов, объект обратного вызова уровня совместимости должен обрабатывать преобразование из WiaImgFmt_BMP в WiaImgFmt_MEMORYBMP. Сопоставление между сообщениями передачи также не является вполне очевидным. Уровень совместимости создает собственную потоковую реализацию. Уровень совместимости отправляет сообщения IT_MSG_DATA обратному вызову приложения при вызовах методом IStream::Write приложением.

Необходимо было внести изменения в интерфейс IWiaTransfer в рамках реализации уровня совместимости; Функция IWiaTransfer::EnumWIA_FORMAT_INFO добавляется в IWiaTransfer , чтобы разрешить передачу TYMED_MULTIPAGE_FILE. Это дополнение не является следствием уровня совместимости, но необходимо, поскольку невозможно получить доступ к интерфейсу IWiaDataTransfer из интерфейса IWiaTransfer или осуществить переход из интерфейса IWiaItem2 в интерфейс IWiaItem.

Интерфейсы IWiaDataTransfer, IWiaTransfer, IWiaItem, IWiaItem2 и IStream и структура STGMEDIUM рассматриваются в документации по пакету SDK для Microsoft Windows.

IWiaMiniDrvTransferCallback