プレビュー ハンドラーとシェル プレビュー ホスト
プレビュー ハンドラーは、ビューの閲覧ウィンドウにファイルの内容の軽量でリッチな 読み取り専用 プレビューを表示するために項目が選択されている場合に呼び出されます。 これは、ファイルに関連付けられているアプリケーションを起動せずに行われます。
このトピックでは、次のトピックについて説明します。
- プレビュー ハンドラーのアーキテクチャ
- サーバー モデルのオプション
- 初期化
- プレビュー ハンドラーのData Flow
- プレビュー ハンドラーのデバッグ
- プレビュー ハンドラーに独自のプロセスを提供する
- 関連トピック
プレビュー ハンドラーのアーキテクチャ
プレビュー ハンドラーは、ホストされているアプリケーションです。 ホストには、Windows Vista または Microsoft Outlook 2007 のWindows エクスプローラーが含まれます。 ホストは、プレビュー ハンドラーとホスト間の通信方法として IPreviewHandlerFrame を実装します。
プレビュー ハンドラー自体は、次のインターフェイスを実装します。
ハンドラーは IObjectWithSite を介して呼び出されます。IObjectWithSite は、IPreviewHandlerFrame オブジェクトを要求してホストとやり取りする IUnknown ポインターを返します。
サーバー モデルのオプション
プレビュー ハンドラーは常にプロセスを使い果たします。 これを実装する方法は 2 つあります。
- プレビュー ハンドラーは、インプロセス サーバーとして構築できますが、アウトプロセス サロゲート ホストを介して実行できます。 可能であればこの方法の使用をお勧めします。 システムは、Prevhost.exe ファイルでこれに対応するサロゲート ホストを提供します。 このメソッドによってビルドされたプレビュー ハンドラーは、Windows XP の Outlook 2007 と互換性がありません。 ただし、これらの同じハンドラーは、Windows Vista で実行されている Windows Explorer と Outlook 2007 で動作します。
- プレビュー ハンドラーは、ローカル コンポーネント オブジェクト モデル (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 Explorer と考えることができます。
- プレビュー ハンドラーは、できればストリームを使用して初期化されます。
- ビュー ウィンドウは、 IPreviewHandler::SetWindow を介してホストからハンドラーに渡されます。
- この時点で、 IPreviewHandler::D oPreview が呼び出されるまで、ハンドラーはそれ以上何も行う必要はありません。
- プレビューは、 IPreviewHandler::D oPreview の呼び出しによって閲覧ウィンドウに表示されます。
- ウィンドウのサイズは、 IPreviewHandler::SetRect を使用して設定されます。
- IPreviewHandler::SetRect を使用して、必要に応じてウィンドウのサイズが変更されます。
- プレビューはアンロードされ、 IPreviewHandler::Unload の呼び出しによって、不要になったときにリソースが解放されます。
プレビュー ハンドラーのデバッグ
推奨事項に従ってプレビュー ハンドラーをインプロセス サーバーとして実装し、プレビュー ハンドラーをデバッグする場合は、Prevhost.exeにアタッチできます。 前述のように、Prevhost.exeのインスタンスが 2 つ存在する可能性があることに注意してください。1 つは通常の低 IL プロセス用で、1 つは低 IL プロセスとして実行をオプトアウトしたハンドラー用です。
使用可能なプロセスの一覧にPrevhost.exeが見つからない場合は、その時点で読み込まれていない可能性があります。 プレビュー用のファイルをクリックするとサロゲートが読み込まれます。その後、添付可能なプロセスとして表示されます。
プレビュー ハンドラーに独自のプロセスを提供する
既定のプロセスで実行するのではなく、ハンドラーの新しいプロセスを強制的に作成する場合は、 AppID の下にハンドラーの新しいサブキーを作成し、その DllSurrogate エントリを "Prevhost.exe" に設定します。 AppID の既定のPrevhost.exeではなく、その AppID サブキーを使用します。
新しいプロセスを提供することで、ハンドラーは既定で行われるように、共有プロセスでの実行を回避できます。 これにより、たとえば、プロセス内の共通言語ランタイム (CLR) の特定のバージョンを保証できます。 これは、プレビュー ハンドラーのマネージド実装を構築する場合に必要です。
Note
32 ビット プレビュー ハンドラーは、64 ビット オペレーティング システムにインストールされている場合、 AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} を使用する必要があります。
関連トピック