次の方法で共有


レガシ アプリケーションと 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 ドライバーとレガシ アプリケーションで互換性レイヤーがどのように動作するかを示しています。

diagram illustrating data transfer between a legacy application and a windows vista driver.

WIA COM プロキシ内のレガシ コールバック オブジェクトは、Windows Vista 転送メッセージとストリームに書き込まれたデータをレガシ転送メッセージに変換し、データをファイルまたはバンディングされたデータ コールバックに書き込みます。

ドライバーが IWiaMiniDrvTransferCallback::GetNextStream メソッドから受け取る IStream インターフェイスによって公開されるいずれかのメソッドを呼び出すとき (ドライバーは IStream::WriteIStream::SeekIStream::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 インターフェイスに移動できないために必要です。

IWiaDataTransferIWiaTransferIWiaItemIWiaItem2IStream の各インターフェイスと STGMEDIUM 構造については、Microsoft Windows SDK のドキュメントで説明されています。

IWiaMiniDrvTransferCallback