Datenübertragung zwischen Legacyanwendung und Windows Vista-Treiber

Die Kompatibilitätsebene muss sicherstellen, dass der Bildverarbeitungsfilter des Treibers immer aufgerufen wird und dass eine Legacyanwendung, die das LocalService-Konto nicht explizit unterstützt, weiterhin eine Datenübertragung durchführen kann. Das LocalService-Konto ist unter Microsoft Windows XP und höheren Betriebssystemen verfügbar.

Mindestens muss ein Legacytreiber sowohl TYMED_FILE als auch TYMED_CALLBACK verfügbar machen. Ein Windows Vista-Treiber macht jedoch niemals TYMED_CALLBACK (oder TYMED_MULTIPAGE_CALLBACK) verfügbar. Der Übertragungsteil der Kompatibilitätsebene stellt sicher, dass eine Legacyanwendung TYMED_CALLBACK sieht, obwohl der Windows Vista-Treiber sie nicht implementiert. TYMED_MULTIPAGE_CALLBACK werden niemals von einem Windows Vista-Treiber verfügbar gemacht.

Einer Legacyanwendung werden die Formate angezeigt, die für TYMED_FILE und TYMED_MULTIPAGE_FILE unterstützt werden, die vom Windows Vista-Treiber verfügbar gemacht werden. Für TYMED_CALLBACK sieht eine Legacyanwendung die gleichen Formate wie der Treiber für TYMED_FILE, mit einer Ausnahme: Anstatt WiaImgFmt_BMP verfügbar zu machen, macht die Kompatibilitätsebene WiaImgFmt_MEMORYBMP für die Legacyanwendung verfügbar. Dies geschieht, indem die Kompatibilitätsebene Aufrufe von IWiaMiniDrv::d rvGetWiaFormatInfo abfangen und alle TYMED_FILE Formate des Windows Vista-Treibers (mit Ausnahme von WiaImgFmt_BMP /WiaImgFmt_MEMORYBMP) für TYMED_CALLBACK hinzufügen. Am wichtigsten ist, dass die Kompatibilitätsebene während der Datenübertragungen ein eigenes Legacyrückrufobjekt erstellt, das Windows Vista-Übertragungsnachrichten und in den Stream geschriebene Daten in Ältere Übertragungsnachrichten konvertiert.

Weitere Informationen zu den TYMED-Konstanten finden Sie unter Grundlegendes zu TYMED.

Die Kompatibilitätsebene erstellt zwei Rückrufobjekte im WIA COM-Proxy: eines für Rückrufübertragungen und eines für Dateiübertragungen. Der WIA COM-Proxy implementiert die IWiaTransferCallback-Schnittstelle. Dieses Rückrufobjekt übernimmt die Konvertierung zwischen der streambasierten Übertragung und der Übertragung im "alten Stil". Die WIA-Kompatibilitätsebene initiiert auch den Bildverarbeitungsfilter des Treibers, an den wir das Rückrufobjekt der Kompatibilitätsebene übergeben. Daher wird der Bildverarbeitungsfilter immer im Kontext der Anwendung ausgeführt, genau wie bei Windows Vista-Übertragungen.

Das folgende Diagramm veranschaulicht, wie die Kompatibilitätsebene mit einem Windows Vista-Treiber und einer Legacyanwendung funktionieren würde.

Diagramm zur Veranschaulichung der Datenübertragung zwischen einer Legacyanwendung und einem Windows Vista-Treiber.

Das Legacy-Rückrufobjekt im WIA COM-Proxy konvertiert Windows Vista-Übertragungsnachrichten und in Stream geschriebene Daten in Ältere Übertragungsnachrichten und schreibt Daten in Datei- oder Banddatenrückrufe.

Wenn der Treiber eine der Methoden aufruft, die von der IStream-Schnittstelle verfügbar gemacht werden, die er von der IWiaMiniDrvTransferCallback::GetNextStream-Methode empfängt (beachten Sie, dass ein Treiber nur IStream::Write, IStream::Seek und IStream::SetSize aufrufen sollte). Daher erstellt die Kompatibilitätsebene eine benutzerdefinierte IStream-Implementierung , die einfach die vom WIA COM-Proxy bereitgestellte IStream-Schnittstelle umschließt.

Legacydateiübertragungen sind einfach. Ein Beispiel für eine solche Übertragung ist, wenn eine Legacyanwendung IWiaDataTransfer::idtGetData aufruft. Die Kompatibilitätsebene erstellt einen Datenstrom für die Datei, den die Anwendung in der STGMEDIUM-Struktur angibt. Dieser Datenstrom wird an den Treiber- oder Bildverarbeitungsfilter übergeben, wenn er IWiaTransferCallback::GetNextStream aufruft, und alle Übertragungsnachrichten können problemlos Legacyübertragungsnachrichten zugeordnet werden. Eine ausführlichere Beschreibung der Zuordnung der Nachrichten finden Sie unter WIA Compatibility Layer Data Transfer Implementation.For more description of the messages are mapped, see WIA Compatibility Layer Data Transfer Implementation.

Beim Aufrufen der IWiaDataTransfer::d tGetData-Methode führt die Kompatibilitätsebene eine strengere Parameterüberprüfung durch. Beispielsweise lässt die Kompatibilitätsebene den Aufruf der IWiaDataTrasnfer::idtGetData-Methode mit TYMED_FILE und einer Seitenanzahl höher als bei Datenübertragungen von In, die die Kompatibilitätsebene nicht nutzen, nicht zu. Es war möglich, die IWiaDataTrasnfer::idtGetData-Methode mit TYMED_FILE aufzurufen und eine Seitenanzahl zu haben, die größer als eine ist.

Legacy-Rückrufübertragungen sind etwas kniffliger. Da ein Windows Vista-Treiber WiaImgFmt_MEMORYBMP nicht unterstützt, was für Legacytreiber erforderlich ist, muss das Rückrufobjekt der Kompatibilitätsebene die Konvertierung von WiaImgFmt_BMP in WiaImgFmt_MEMORYBMP verarbeiten. Auch die Zuordnung zwischen Übertragungsnachrichten ist nicht ganz einfach. Die Kompatibilitätsebene erstellt eine eigene Streamimplementierung. Die Kompatibilitätsebene sendet IT_MSG_DATA Nachrichten an den Rückruf der Anwendung, wenn die Anwendung die IStream::Write-Methode aufruft.

Im Rahmen der Implementierung der Kompatibilitätsebene musste eine Änderung an der IWiaTransfer-Schnittstelle vorgenommen werden. Die Funktion IWiaTransfer::EnumWIA_FORMAT_INFO wird zu IWiaTransfer hinzugefügt, um TYMED_MULTIPAGE_FILE Übertragungen zu ermöglichen. Diese Ergänzung ist keine Folge der Kompatibilitätsebene, sondern erforderlich, da es nicht möglich ist, von der IWiaTransfer-Schnittstelle oder von der IWiaItem2-Schnittstelle zur IWiaItem-Schnittstelle auf die IWiaItem-Schnittstelle zu gelangen.

Die Schnittstellen IWiaDataTransfer, IWiaTransfer, IWiaItem, IWiaItem2 und IStream sowie die STGMEDIUM-Struktur werden in der Microsoft Windows SDK-Dokumentation erläutert.

IWiaMiniDrvTransferCallback