プレビュー ハンドラーとシェル プレビュー ホスト

プレビュー ハンドラーは、アイテムが選択されている場合に呼び出され、ビューの閲覧ウィンドウにファイルの内容の軽量でリッチな 読み取り専用 プレビューが表示されます。 これは、ファイルに関連付けられているアプリケーションを起動せずに行われます。

このトピックでは、次のトピックについて説明します。

プレビュー ハンドラーのアーキテクチャ

プレビュー ハンドラーは、ホストされているアプリケーションです。 ホストには、Windows Vista または Microsoft Outlook 2007 の Windows エクスプローラーが含まれます。 ホストは、プレビュー ハンドラーとホスト間の通信方法として IPreviewHandlerFrame を実装します。

プレビュー ハンドラー自体は、次のインターフェイスを実装します。

ハンドラーは IObjectWithSite を介して呼び出されます。これにより、IPreviewHandlerFrame オブジェクトを要求してホストと対話するための IUnknown ポインターが返されます。

サーバー モデル のオプション

プレビュー ハンドラーは常にプロセスを使い果たします。 これを実装する方法は 2 つあります。

  1. プレビュー ハンドラーは、インプロセス サーバーとして構築できますが、アウトプロセス サロゲート ホストを介して実行できます。 可能であればこの方法の使用をお勧めします。 システムは、Prevhost.exe ファイル内のこれに対して代理ホストを提供します。 このメソッドによってビルドされたプレビュー ハンドラーは、Windows XP 上の Outlook 2007 と互換性がありません。 ただし、これらの同じハンドラーは、Windows Vista で実行されている Windows エクスプローラー と Outlook 2007 で動作します。
  2. プレビュー ハンドラーは、ローカル コンポーネント オブジェクト モデル (COM) サーバーとして構築できます。 これはいくつかの理由で推奨されません。 まず、インプロセス サーバーの実装が簡単です。 さらに重要なのは、インプロセス サーバーとしての実装により、ハンドラー オブジェクトの有効期間をより細かく制御できるため、クリーンアップと効率が向上することです。

既定では、セキュリティ上の理由から、プレビュー ハンドラーは低整合性レベル (IL) プロセスで実行されます。 必要に応じて、レジストリで次の値を設定することで、低 IL プロセスとして実行を無効にすることができます。 ただし、これを行うことをお勧めしません。 システムは最終的に、低 IL ではないプロセスを拒否するように構成される可能性があります。

HKEY_CLASSES_ROOT
   CLSID
      {YOUR HANDLER'S CLSID}
         DisableLowILProcessIsolation [DWORD] = 1

既定では、異なるプレビュー ハンドラーが同じプロセスを共有します。 Prevhost.exeの 2 つのインスタンスを同時に実行できます。1 つは、低 IL プロセスとして実行されているハンドラー用、1 つはその動作をオプトアウトしたハンドラー用です。

初期化

サムネイルおよびプロパティ ハンドラーと同様に、ストリームを使用してハンドラーを初期化することを強くお勧めします。 必要に応じてファイルまたは項目を使用して初期化できますが、ストリームはハンドラーを実装するための最も安全な方法を提供します。 ストリームを介した初期化により、バッファー オーバーランからシステムを保護し、ハンドラーが情報を書き込むことができる場所を制限し、他のウィンドウとの通信を制限するなど、低 IL プロセスとしてハンドラーを実行するシステムのファイルの整合性と安定性の利点が保証されます。

ファイルまたはシェル項目を使用して初期化する必要がある場合は、ファイル パスまたは IShellItem への参照を格納します。 IPreviewHandler::D oPreview が呼び出されるまで、これらのソースからデータを読み取らないでください。

一般に、初期化では、プレビュー イメージの作成や保存など、負荷の高い作業を行うべきではありません。 最適な効率を得るための処理は、プレビューが呼び出されるまで実行しないでください。

プレビュー ハンドラー Data Flow

プレビュー プロセスのデータ フローは、ここに示す一般的なパスに従います。 ホストは、Windows Vista または Outlook 2007 では Windows エクスプローラーと考えることができます。

  1. プレビュー ハンドラーは、できればストリームを使用して初期化されます。
  2. ビュー ウィンドウは、 IPreviewHandler::SetWindow を介してホストからハンドラーに渡されます。
  3. この時点で、 IPreviewHandler::D oPreview が呼び出されるまで、ハンドラーはそれ以上何も行う必要はありません。
  4. プレビューは、 IPreviewHandler::D oPreview の呼び出しによって閲覧ウィンドウに表示されます。
  5. ウィンドウのサイズは、 IPreviewHandler::SetRect によって設定されます。
  6. IPreviewHandler::SetRect を使用して、必要に応じてウィンドウのサイズが変更されます。
  7. プレビューはアンロードされ、 IPreviewHandler::Unload の呼び出しによって不要になったときにリソースが解放されます。

プレビュー ハンドラーのデバッグ

プレビュー ハンドラーをインプロセス サーバーとして実装するための推奨事項に従っている場合は、プレビュー ハンドラーをデバッグするために、Prevhost.exeにアタッチできます。 前述のように、Prevhost.exeのインスタンスが 2 つ存在する可能性があることに注意してください。1 つは通常の低 IL プロセス用、1 つは低 IL プロセスとして実行をオプトアウトしたハンドラー用です。

使用可能なプロセスの一覧にPrevhost.exeが見つからない場合は、その時点で読み込まれていない可能性があります。 プレビュー用のファイルをクリックするとサロゲートが読み込まれます。その後、添付可能なプロセスとして表示されます。

プレビュー ハンドラーに独自のプロセスを提供する

既定のプロセスで実行するのではなく、ハンドラーの新しいプロセスを強制的に作成する場合は、 AppID の下にハンドラーの新しいサブキーを作成し、その DllSurrogate エントリを "Prevhost.exe" に設定します。 AppID の既定のPrevhost.exeの代わりに、その AppID サブキーを使用します。

新しいプロセスを提供することで、ハンドラーは既定で実行されるのと同様に、共有プロセスでの実行を回避できます。 これにより、たとえば、プロセス内の共通言語ランタイム (CLR) の特定のバージョンを確保できます。 これは、プレビュー ハンドラーのマネージド実装をビルドする場合に必要です。

注意

32 ビット プレビュー ハンドラーは、64 ビット オペレーティング システムにインストールされている場合、 AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} を使用する必要があります。

 

プレビュー ハンドラーのビルド

プレビュー ハンドラーを登録する方法

プレビュー ハンドラーのガイドライン