次の方法で共有


Windows Vista アプリケーションとレガシ ドライバー間のデータ転送

互換性レイヤーを使用すると、Windows Vista アプリケーションは、レガシ ドライバーで IWiaTransfer::Download (Microsoft Windows SDK ドキュメントで説明) を呼び出すことができます。 互換性レイヤーでは、フォルダー転送コードと形式変換を実装する必要があります。 互換性レイヤーは、従来のドライバーから複数のページを常に転送できるよう、フィーダー転送用の特別なコードを実装します。 Windows Vista アプリケーションは、TYMED_FILE 転送を使用しても、フィーダー項目からのスキャン中に常に複数のページを要求できる必要があります。 次の図は、Windows Vista アプリケーションを備えたレガシ ドライバーを示しています。

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

WIA サービス内のレガシ コールバック オブジェクトは、レガシ転送メッセージとデータを Windows Vista 転送メッセージに変換し、指定されたストリームにデータを書き込みます。

Windows Vista アプリケーションは、TYMED_FILE と TYMED_MULTIPAGE_FILE のみを想定しているため、互換性レイヤーは、TYMED_CALLBACK と TYMED_MULTIPAGE_CALLBACK がレガシ ドライバーから Windows Vista アプリケーションに公開されないようにする役割を担います。

互換性レイヤーのこの部分を実装する最も簡単な方法は、必ず TYMED_FILE と TYMED_MULTIPAGE_FILE 設定を使用してレガシ ドライバーを呼び出す方法です。 これを行う短所は、データをアプリケーションのストリームに書き戻す前に、ドライバーが常にイメージ全体をスキャンする必要がある点にあります。 したがって、互換性レイヤーは、Windows Vista アプリケーションが形式 WiaImgFmt_BMP のスキャンを要求するときに TYMED_CALLBACK を使用します (WIA_IPA_FORMAT プロパティは WiaImgFmt_BMP に設定されます)。 これにより、互換性レイヤーは、バンドごとにデータ バック バンドを書き込むことが可能になります。

ただし、レガシ ドライバーは WiaImgFmt_BMP をサポートしておらず、TYMED_CALLBACK の WiaImgFmt_MEMORYBMP をサポートしています。 したがって、変換コールバック オブジェクトは BMP ファイル ヘッダーを作成し、このファイル ヘッダーをアプリケーションにも書き戻す必要があります。 これは、BMP ファイル ヘッダーを BMP 情報ヘッダーから直接構築できる場合などは簡単です。 ただし、BMP 情報ヘッダーの高さが 0 に設定されている場合があります。 この場合、WIA 互換性レイヤーは、BMP ファイル ヘッダーを書き込んで BMP 情報ヘッダーを更新する前に、すべてのデータが転送されるまで待機する必要があります。

TYMED_CALLBACK 以外の TYMED 転送がレガシ ドライバーから実行される理由は、マルチページ形式は通常、TYMED_MULTIPAGE_FILE によってのみサポートされ、ドライバーは通常、TYMED_CALLBACK よりも多くの形式を TYMED_FILE でサポートしていることにあります。

TYMED_FILE 転送時、互換性レイヤーは転送が完了するまで待機してから、アプリケーションのストリームにデータを書き戻します。 これを行うには、ファイルをメモリにマッピングし、メモリ内のすべてのデータを 1 回の書き込み要求で書き戻します。

TYMED_CALLBACK 転送時、互換性レイヤーは、レガシ ドライバーから IT_MSG_DATA 転送メッセージを受信するたびに、アプリケーションのストリームに書き戻されます。

互換性レイヤーには、FEEDER 転送用の特別なコードも含まれています。 このコードにより、TYMED が TYMED_MULTIPAGE_FILE でない場合でも、互換性レイヤーが ADF から複数のページを転送できるようになります。 これを行うには、互換性レイヤーをドライバーに複数回呼び出し、毎回 1 つのページのみを要求します。 このソリューションにより、Windows Vista アプリケーションによって呼び出されたときに、すべてのレガシ ドライバーがフィーダーからの複数ページの転送を処理できるようになります。

レガシ ドライバーは、転送中 "帯域外" メッセージを送信できます (プレビューなど)。 これらのメッセージは、ストリーム ベースの転送モデルに適合しないため無視されます。

TYMED 定数の詳細については、「TYMED について」を参照してください。