EternalWindows
シェル拡張 / シェル拡張の位置づけ

シェルとは、ファイルシステム上に存在するファイルやフォルダを、GUIとして表示及び管理するアプリケーションのことです。 シェルはファイルやフォルダをアイコンとして表示し、 マウスでクリックするだけでファイルを開けるという利便性を提供します。 もし、シェルというものが存在しなければ、ユーザーはコマンドプロンプトからファイルパスを入力しなければならず、 直観的な操作ができなかったことでしょう。 シェルとして動作するアプリケーションは、次のレジストリキーに登録されています。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

上記キーのShellエントリにシェルとして動作するアプリケーション名が格納されています。 WindowsにおけるデフォルトのシェルはExplorer.exeですが、 Shellエントリに独自のアプリケーション名を格納することで、 独自のシェルが起動されるようにすることもできます。 一般には、このようなシェルは互換シェルと呼ばれています。 ちなみに、ファイラーと呼ばれるアプリケーションは、シェルとは別物であることに注意してください。 フォルダの中身をGUIで表示するという点ではファイラーもシェルも同一ですが、 シェルはこれに加えてデスクトップやタスクバー、スタートメニューなども表示します。

シェル拡張とは、シェルの機能を拡張するためのDLLです。 このDLLがレジストリに登録されている場合、シェルは必要に応じてそのDLLをロードするようになるため、 シェルの動作を一部変更することができるようになります。 次に、定義されているシェル拡張の種類を示します。

種類 説明
Infotip ハンドラ ファイルに独自のツールチップを表示する。
アイコン オーバーレイ ファイルにオーバーレイアイコンを表示する。
プロパティシート ハンドラ ファイルに関連するプロパティダイアログに独自のプロパティシートを追加する。
コピーフック ハンドラ フォルダのコピー、移動、名前変更、削除を検出する。
アイコン ハンドラ ファイルのアイコンを独自のアイコンに変更する。
ショートカットメニュー ハンドラ ファイルに関連するメニューに独自の項目を追加する。
サムネイルイメージ ハンドラ ファイルのサムネイルイメージを表示する。Windows Vistaから使用可。
プレビュー ハンドラ ファイルのプレビューを表示する。Windows Vistaから使用可。
メタデータ ハンドラ ファイルのプロパティを設定/取得できるようにする。Windows Vistaから使用可。
ShellExecute フック ShellExecute(Ex)の呼び出しを検出する。
デスクバンド タスクバー上にウインドウを表示する。
仮想フォルダ フォルダ内のアイテムや画面を独自に用意する。

上記の表から分かるように、シェル拡張の多くは特定の拡張子を持ったファイルに対して機能します。 その拡張子は.txtや.bmpのような既存のものでも構いませんし、全く独自のものでも構いません。 既存の拡張子を対象にする場合は、シェル拡張の解除時にその拡張子のレジストリキーを削除しないよう注意してください。

シェル拡張を開発するというのは、シェルが理解できるインターフェースを実装したCOMオブジェクトを作成するということです。 このインターフェースはシェル拡張の種類によって異なり、 たとえばInfotip ハンドラならIQueryInfoというインターフェースを実装することになります。 また、開発したシェル拡張はレジストリに登録しなければなりませんが、 この場所(キー)についてもシェル拡張によって異なることになっています。 COMオブジェクトをレジストリへ登録する方法については、 COMサーバーの章でも取り上げたように次の文字列が有効です。

regsvr32 C:\sample.dll (登録の解除時は regsvr32 /u C:\sample.dll のようにする)

この文字列をコマンドプロント上で実行することで、 sample.dllのDllRegisterServerが呼び出され、レジストリへの登録処理が行えるようになります。

レジストリにシェル拡張を登録しても、シェルは無条件にそのDLLをロードするわけではありません。 シェル拡張のCLSIDが次のレジストリキーのエントリに設定されている場合は、 そのCLSIDで識別されるシェル拡張はロードされないことになっています。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked

システム管理者は不要になったシェル拡張を上記キーで無効にすることができますが、 通常はシェル拡張のCLSIDを把握していないと思われます。 よって、シェル拡張の提供側が無効処理を用意しておいたほうがよいでしょう。

本章の各サンプルは、複数同時にインストールしないようにしてください。 理由は、各サンプルによって参照するレジストリキーが重複しており、 片方のサンプルのアンインストールに伴って、もう片方のサンプルのキーも削除されてしまうからです。 よって、別のサンプルをインストールする場合は、 既にインストールされているサンプルをアンインストールしてからにしてください。 本章のサンプルでは、.bhyという拡張子のファイルを対象にすることが多いため、 この拡張子を持ったファイルをデスクトップなどに作成しておいてください。


戻る