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


Передача данных между устаревшим приложением и драйвером 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::d rvGetWiaFormatInfo и добавления всех форматов 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 рассматриваются в документации по Microsoft Windows SDK.

IWiaMiniDrvTransferCallback