レガシ アプリケーションと Windows Vista ドライバー間のデータ転送
互換性レイヤーでは、常にドライバーの画像処理フィルターが呼び出され、LocalService アカウントを明示的にサポートしていないレガシ アプリケーションが引き続きデータ転送を実行できるようにする必要があります。 LocalService アカウントは、Microsoft Windows XP 以降のオペレーティング システムで使用できます。
少なくとも、レガシ ドライバーは、TYMED_FILE と TYMED_CALLBACK の両方を公開する必要があります。ただし、Windows Vista ドライバーは、TYMED_CALLBACK (または TYMED_MULTIPAGE_CALLBACK) を公開することはありません。 互換性レイヤーの転送部分では、Windows Vista ドライバーで実装されていなくても TYMED_CALLBACK がレガシ アプリケーションに表示されます。 TYMED_MULTIPAGE_CALLBACK が Windows Vista ドライバーから公開されることはありません。
レガシ アプリケーションには、Windows Vista ドライバーにより公開される TYMED_FILEとTYMED_MULTIPAGE_FILE でサポートされている形式が表示されます。 TYMED_CALLBACK の場合、レガシ アプリケーションには、ドライバーが TYMED_FILE 用に公開するのと同じ形式が表示されます。ただし、WiaImgFmt_BMP を公開する代わりに、互換性レイヤーがレガシ アプリケーションに WiaImgFmt_MEMORYBMP を公開する点が異なります。 これを行う方法として、互換性レイヤーで IWiaMiniDrv::d rvGetWiaFormatInfo への呼び出しをインターセプトし、TYMED_CALLBACK のすべての Windows Vista ドライバーの TYMED_FILE 形式 (WiaImgFmt_BMP /WiaImgFmt_MEMORYBMP を除く) を追加することができます。 最も重要な点として、互換性レイヤーは、データ転送中に独自のレガシ コールバック オブジェクトを作成し、Windows Vista 転送メッセージとそのストリームに書き込まれたデータをレガシ転送メッセージに変換します。
TYMED 定数の詳細については、「TYMED について」を参照してください。
互換性レイヤーは、WIA COM プロキシに 2 つのコールバック オブジェクトを作成します。1 つはコールバック転送用、1 つはファイル転送用です。 WIA COM プロキシは、IWiaTransferCallback インターフェイスを実装 します。 このコールバック オブジェクトは、ストリーム ベースの転送と "旧式スタイル" の転送の間の変換を処理します。 WIA 互換性レイヤーは、互換性レイヤーのコールバック オブジェクトを渡すドライバーの画像処理フィルターも開始します。 したがって、イメージ処理フィルターは、Windows Vista 転送と同様、常にアプリケーションのコンテキストで実行されます。
次の図は、Windows Vista ドライバーとレガシ アプリケーションで互換性レイヤーがどのように動作するかを示しています。
WIA COM プロキシ内のレガシ コールバック オブジェクトは、Windows Vista 転送メッセージとストリームに書き込まれたデータをレガシ転送メッセージに変換し、データをファイルまたはバンディングされたデータ コールバックに書き込みます。
ドライバーが IWiaMiniDrvTransferCallback::GetNextStream メソッドから受け取る IStream インターフェイスによって公開されるいずれかのメソッドを呼び出すとき (ドライバーは IStream::Write、IStream::Seek、IStream::SetSize のみを呼び出す必要がある点に注意してください)。 したがって、互換性レイヤーは、WIA COM プロキシが提供する IStream インターフェイスをラップするカスタム IStream 実装を作成します。
レガシ ファイル転送は簡単です。 このような転送の例として、レガシ アプリケーションが IWiaDataTransfer::idtGetData を呼び出すケースがあります。 互換性レイヤーは、STGMEDIUM 構造でアプリケーションが指定するファイルにデータ ストリームを作成します。 このストリームは、IWiaTransferCallback::GetNextStream を呼び出すときにドライバーまたは画像処理フィルターに渡され、すべての転送メッセージがレガシ転送メッセージに簡単にマッピングされます。 メッセージのマッピング方法について詳しくは、「WIA 互換性レイヤーのデータ転送の実装」をご覧ください。
IWiaDataTransfer::d tGetData メソッドを呼び出すと、互換性レイヤーはパラメーターのチェックを厳密にします。 たとえば、互換性レイヤーでは、TYMED_FILE と 1 より大きいページ カウントを使って IWiaDataTrasnfer::idtGetData メソッドを呼び出すことはできません。互換性レイヤーを利用しないデータ転送では、TYMED_FILE を使って IWiaDataTrasnfer::idtGetData メソッドを呼び出し、ページ カウントを 1 より大きくすることができます。
レガシ コールバック転送は少し複雑です。 Windows Vista ドライバーは、レガシ ドライバーに必要な WiaImgFmt_MEMORYBMP をサポートしていないため、互換性レイヤーのコールバック オブジェクトは、WiaImgFmt_BMP から WiaImgFmt_MEMORYBMP への変換を処理する必要があります。 転送メッセージ間のマッピングもあまり簡単ではありません。 互換性レイヤーは、独自のストリーム実装を作成します。 互換性レイヤーは、アプリケーションによる IStream::Write メソッドの呼び出し時に、IT_MSG_DATA メッセージをアプリケーションのコールバックに送信します。
互換性レイヤーの実装の一環として、IWiaTransfer インターフェイスに変更を加える必要がありました。IWiaTransfer::EnumWIA_FORMAT_INFO 関数が IWiaTransfer に追加され、TYMED_MULTIPAGE_FILE 転送が許可されます。 この追加は、互換性レイヤーの結果行われるものではありませんが、IWiaTransfer インターフェイスから IWiaDataTransfer インターフェイスに、または IWiaItem2 インターフェイスから IWiaItem インターフェイスに移動できないために必要です。
IWiaDataTransfer、IWiaTransfer、IWiaItem、IWiaItem2、IStream の各インターフェイスと STGMEDIUM 構造については、Microsoft Windows SDK のドキュメントで説明されています。