シェル拡張機能ハンドラーの登録
シェル拡張ハンドラー オブジェクトは、シェルで使用する前に登録する必要があります。 このトピックでは、シェル拡張ハンドラーを登録する方法の一般的な説明です。
シェル拡張ハンドラーを作成または変更するときは、いつでも、変更を加えたことをシステムに通知することが重要です。 これを行うには、 SHChangeNotify を呼び出し、 SHCNE_ASSOCCHANGED イベントを指定します。 SHChangeNotify を呼び出さないと、システムが再起動されるまで変更が認識されない可能性があります。
Windows 2000 システムに適用されるその他の要因がいくつかあります。 詳細については、「 Windows 2000 システムへのシェル拡張ハンドラーの登録 」セクションを参照してください。
すべてのコンポーネント オブジェクト モデル (COM) オブジェクトと同様に、Windows ソフトウェア開発キット (SDK) で提供される Guidgen.exe などのツールを使用してハンドラーの GUID を作成する必要があります。 HKEY_CLASSES_ROOT\CLSID の下にサブキーを作成します。その名前は、その GUID の文字列形式です。 シェル拡張ハンドラーはインプロセス サーバーであるため、(既定値) の値をハンドラーの DLL のパスに設定して、その GUID サブキーの下に InprocServer32 サブキーを作成する必要もあります。 アパートメント スレッド モデルを使用します。 次に 1 つの例を示します。
HKEY_CLASSES_ROOT
CLSID
{00021500-0000-0000-C000-000000000046}
InprocServer32
(Default) = %windir%\System32\Example.dll
ThreadingModel = Apartment
シェルは、シェル拡張ハンドラーを含むアクションを実行するたびに、適切なレジストリ サブキーをチェックします。 拡張ハンドラーが登録されているサブキーは、呼び出されるタイミングを制御します。 たとえば、 シェルがファイルの種類のメンバーのショートカット メニューを表示するときに、ショートカット メニュー ハンドラーを呼び出すのが一般的です。 この場合、ハンドラーはファイルの種類の ProgID サブキーの下に登録する必要があります。
このトピックでは、次のテーマについて説明します。
ハンドラー名
シェル拡張ハンドラーを有効にするには、ProgID (ファイルの種類の場合) または Shell オブジェクトの種類名 (predefined_shell_objects) のいずれかの ShellEx サブキーの下に、ハンドラー サブキー名 (下記参照) を含むサブキーを作成します。
たとえば、MyProgram.1 のショートカット メニュー拡張ハンドラーを登録する場合は、まず次のサブキーを作成します。
HKEY_CLASSES_ROOT
MyProgram.1
ShellEx
ContextMenuHandlers
次のハンドラーでは、シェル拡張機能のクラス識別子 (CLSID) の文字列バージョンとしてという名前の "ハンドラー サブキー名" サブキーの下にサブキーを作成します。 複数のサブキーを作成することで、ハンドラー サブキー名の下に複数の拡張機能を登録できます。
Handler | インターフェイス | ハンドラー サブキー名 |
---|---|---|
列プロバイダー ハンドラー | IColumnProvider | ColumnHandlers |
ショートカット メニュー ハンドラー | IContextMenu | ContextMenuHandlers |
Copyhook ハンドラー | ICopyHook | CopyHookHandlers |
ドラッグ アンド ドロップ ハンドラー | IContextMenu | DragDropHandlers |
プロパティ シート ハンドラー | IShellPropSheetExt | PropertySheetHandlers |
次のハンドラーの場合、"Handler Subkey Name" キーの既定値は、シェル拡張機能の CLSID の文字列バージョンです。 これらのハンドラーに登録できる拡張機能は 1 つだけです。
Handler | インターフェイス | ハンドラー サブキー名 |
---|---|---|
データ ハンドラー | Idataobject | DataHandler |
ドロップ ハンドラー | IDropTarget | DropHandler |
アイコン ハンドラー | IExtractIconA/W | IconHandler |
サムネイル画像ハンドラー | IThumbnailProvider | {E357FCCD-A995-4576-B01F-234630154E96} |
ヒント ハンドラー | IQueryInfo | {00021500-0000-0000-C000-000000000046} |
シェル リンク (ANSI) | IShellLinkA | {000214EE-0000-0000-C000-000000000046} |
シェル リンク (UNICODE) | IShellLinkW | {000214F9-0000-0000-C000-0000000000046} |
構造化ストレージ | IStorage | {0000000B-0000-0000-C000-000000000046} |
Metadata | IPropertySetStorage | PropertyHandler |
スタート メニューにピン留めする | IStartMenuPinnedList | {a2a9545d-a0c2-42b4-9708-a0b2badd77c8} |
タスク バーにピン留め | {90AA3A4E-1CBA-4233-B8BB-535773D48449} |
[ スタート メニューにピン留めする] と [ タスク バーにピン留め する] を項目のショートカット メニューに追加するために指定されたサブキーは、 IsShortCut エントリを含むファイルの種類にのみ必要です。
定義済みのシェル オブジェクト
シェルは、ファイルの種類と同じ方法で拡張できる HKEY_CLASSES_ROOT の下に追加のオブジェクトを定義します。 たとえば、すべてのファイルにプロパティ シート ハンドラーを追加するには、 PropertySheetHandlers サブキーの下に登録します。
HKEY_CLASSES_ROOT
*
shellex
PropertySheetHandlers
次の表に、拡張ハンドラーを登録できる HKEY_CLASSES_ROOT のさまざまなサブキーを示します。 多くの拡張ハンドラーは、一覧表示されているすべてのサブキーの下に登録できないことに注意してください。 詳細については、特定のハンドラーのドキュメントを参照してください。
サブキー | 説明 | 使用可能なハンドラー |
---|---|---|
* | すべてのファイル | ショートカット メニュー、プロパティ シート、動詞 (下記参照) |
AllFileSystemObjects | すべてのファイルとファイル フォルダー | ショートカット メニュー、プロパティ シート、動詞 |
フォルダー | すべてのフォルダー | ショートカット メニュー、プロパティ シート、動詞 |
ディレクトリ | ファイル フォルダー | ショートカット メニュー、プロパティ シート、動詞 |
Directory\Background | ファイル フォルダーの背景 | ショートカット メニューのみ |
DesktopBackground | デスクトップの背景 (Windows 7 以降) | ショートカット メニュー、動詞 |
ドライブ | MyComputer のすべてのドライブ ("C:\" など) | ショートカット メニュー、プロパティ シート、動詞 |
Network | ネットワーク全体 ([マイ ネットワークの場所] の下) | ショートカット メニュー、プロパティ シート、動詞 |
Network\Type\# | # 型のすべてのオブジェクト (以下を参照) | ショートカット メニュー、プロパティ シート、動詞 |
Netshare | すべてのネットワーク共有 | ショートカット メニュー、プロパティ シート、動詞 |
NetServer | すべてのネットワーク サーバー | ショートカット メニュー、プロパティ シート、動詞 |
network_provider_name | ネットワーク プロバイダー "network_provider_name" によって提供されるすべてのオブジェクト | ショートカット メニュー、プロパティ シート、動詞 |
プリンター | すべてのプリンタ | ショートカット メニュー、プロパティ シート |
AudioCD | CD ドライブのオーディオ CD | 動詞のみ |
Dvd | DVD ドライブ (Windows 2000) | ショートカット メニュー、プロパティ シート、動詞 |
メモ
- ファイル フォルダーの背景ショートカット メニューにアクセスするには、ファイル フォルダー内を右クリックしますが、フォルダーの内容にアクセスすることはできません。
- "動詞" は、サブキー\シェル\動詞HKEY_CLASSES_ROOT\登録された特殊なコマンドです。
- ネットワーク\の種類\#の場合、"#" は 10 進数のネットワーク プロバイダーの種類のコードです。 ネットワーク プロバイダーの種類コードは、ネットワークの種類の上位ワードです。 ネットワークの種類の一覧は、Winnetwk.h ヘッダー ファイル (WNNC_NET_* 値) に示されます。 たとえば、WNNC_NET_SHIVAは0x00330000であるため、対応する型サブキーはネットワーク\の種類\51HKEY_CLASSES_ROOT\になります。
- "network_provider_name" は 、WNetGetProviderName で指定されたネットワーク プロバイダー名で、スペースはアンダースコアに変換されます。 たとえば、Microsoft ネットワーク ネットワーク プロバイダーがインストールされている場合、そのプロバイダー名は "Microsoft Windows Network" で、対応する network_provider_name は Microsoft_Windows_Network。
拡張ハンドラー登録の例
特定のハンドラーを有効にするには、ハンドラーの名前を持つ拡張ハンドラー型サブキーの下にサブキーを作成します。 シェルはハンドラーの名前を使用しませんが、その型サブキーの他のすべての名前とは異なる必要があります。 名前サブキーの既定値をハンドラーの GUID の文字列形式に設定します。
次の例では、.myp ファイルの種類の例を使用して、ショートカット メニューとプロパティ シート拡張ハンドラーを有効にするレジストリ エントリを示します。
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
CLSID
{00000000-1111-2222-3333-444444444444}
InProcServer32
(Default) = C:\MyDir\MyCommand.dll
ThreadingModel = Apartment
{11111111-2222-3333-4444-555555555555}
InProcServer32
(Default) = C:\MyDir\MyPropSheet.dll
ThreadingModel = Apartment
MyProgram.1
(Default) = MyProgram Application
Shellex
ContextMenuHandler
MyCommand
(Default) = {00000000-1111-2222-3333-444444444444}
PropertySheetHandlers
MyPropSheet
(Default) = {11111111-2222-3333-4444-555555555555}
関連トピック