シェル拡張機能ハンドラーの登録

シェル拡張ハンドラー オブジェクトは、シェルで使用する前に登録する必要があります。 このトピックでは、シェル拡張ハンドラーを登録する方法の一般的な説明です。

シェル拡張ハンドラーを作成または変更するときは、いつでも、変更を加えたことをシステムに通知することが重要です。 これを行うには、 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_nameMicrosoft_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}

シェル拡張機能ハンドラーの初期化