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

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

シェル拡張ハンドラーを作成または変更する場合は、いつでも、変更を加えたことをシステムに通知することが重要です。 これを行うには、 shChangeNotify を呼び出し、 SHCNE_ASSOCCHANGED イベントを指定します。 SHChangeNotify を呼び出さないと、システムが再起動されるまで変更が認識されない可能性があります。

Windows 2000 システムには、いくつかの追加の要因が適用されます。 詳細については、「Windows 2000 Systems でのシェル拡張ハンドラーの登録」セクションを参照してください。

すべてのコンポーネント オブジェクト モデル (COM) オブジェクトと同様に、Windows ソフトウェア開発キット (SDK) で提供される Guidgen.exeなどのツールを使用してハンドラーの GUID を作成する必要があります。 HKEY_CLASSES_ROOT\CLSID の下に、その GUID の文字列形式の名前を持つサブキーを作成します。 シェル拡張ハンドラーはインプロセス サーバーであるため、(既定) 値をハンドラーの DLL のパスに設定して、その GUID サブキーの下に InprocServer32 サブキーを作成する必要もあります。 アパートメントスレッドモデルを使用します。 例を次に示します。

HKEY_CLASSES_ROOT
   CLSID
      {00021500-0000-0000-C000-000000000046}
         InprocServer32
            (Default) = %windir%\System32\Example.dll
            ThreadingModel = Apartment

Important

シェル拡張ハンドラーでは、ThreadingModel は Apartmentである必要があります シェルのフォルダー ビューとエクスプローラーは、シングルスレッド アパートメント (STA) スレッドで実行されます。 FreeまたはBothスレッド モデルを使用すると、断続的なエラー、デッドロック、または診断が困難なクラッシュが発生する可能性があります。

パッケージ デスクトップ アプリ (MSIX) の場合は、レジストリ キーを直接書き込むのではなく、 desktop4:Extension 要素を使用したマニフェスト ベースの登録を優先します。 これにより、適切なパッケージ ID とクリーン アンインストールが保証されます。

シェルがシェル拡張ハンドラーを含むことができるアクションを実行するたびに、適切なレジストリ サブキーがチェックされます。 拡張ハンドラーが登録されているサブキーは、呼び出されるタイミングを制御します。 たとえば、 シェルがファイルの種類のメンバーのショートカット メニューを表示するときに、ショートカット メニュー ハンドラーを呼び出すのが一般的な方法です。 この場合、ハンドラーはファイルの種類の ProgID サブキーに登録する必要があります。

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

ハンドラー名

シェル拡張ハンドラーを有効にするには、ProgID (ファイルの種類の場合) またはシェル オブジェクトの種類名 (predefined_shell_objectsの場合) のいずれかの ShellEx サブキーの下に、ハンドラー サブキー名 (下記参照) を持つサブキーを作成します。

たとえば、MyProgram.1 のショートカット メニュー拡張ハンドラーを登録する場合は、まず次のサブキーを作成します。

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

次のハンドラーの場合は、シェル拡張機能のクラス識別子 (CLSID) の文字列バージョンとして名前が付けられた "Handler Subkey name" サブキーの下にサブキーを作成します。 複数のサブキーを作成することで、ハンドラー サブキー名の下に複数の拡張機能を登録できます。

ハンドラー Interface ハンドラー サブキー名
列プロバイダーハンドラー IColumnProvider ColumnHandlers
ショートカット メニュー ハンドラー IContextMenu ContextMenuHandlers
Copyhook ハンドラー ICopyHook CopyHookHandlers
ドラッグ アンド ドロップ ハンドラー IContextMenu DragDropHandlers
プロパティ シート ハンドラー IShellPropSheetExt PropertySheetHandlers

 

次のハンドラーの場合、"Handler Subkey Name" キーの既定値は、シェル拡張機能の CLSID の文字列バージョンです。 これらのハンドラーに登録できる拡張機能は 1 つだけです。

ハンドラー Interface ハンドラー サブキー名
データ ハンドラー IDataObject DataHandler
ドロップハンドラー IDropTarget DropHandler
アイコン ハンドラー IExtractIconA/W IconHandler
サムネイル 画像ハンドラー IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
情報ヒント処理プログラム IQueryInfo {00021500-0000-0000-C000-0000000000046}
シェル リンク (ANSI) IShellLinkA {000214EE-0000-0000-C000-0000000000046}
シェル リンク (UNICODE) IShellLinkW {000214F9-0000-0000-C000-000000000046}
構造化ストレージ IStorage {0000000B-0000-0000-C000-0000000000046}
メタデータ 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 すべてのファイルとフォルダー ショートカット メニュー、プロパティ シート、コマンド
Folder すべてのフォルダー ショートカット メニュー、プロパティ シート、動詞
Directory ファイル フォルダー ショートカット メニュー、プロパティ シート、コマンド
Directory\Background ファイル フォルダーの背景 ショートカットメニューのみ
DesktopBackground デスクトップの背景 (Windows 7 以上) ショートカットメニュー、動詞
ドライブ MyComputer のすべてのドライブ ("C:\" など) ショートカット メニュー、プロパティ シート、コマンド
Network ネットワーク全体 ([マイ ネットワークの場所] の下) ショートカット メニュー、プロパティ シート、コマンド
Network\Type\# #型のすべてのオブジェクト (下記参照) ショートカット メニュー、プロパティ シート、コマンド
Netshare すべてのネットワーク共有 ショートカット メニュー、プロパティ シート、コマンド
NetServer すべてのネットワーク サーバー ショートカット メニュー、プロパティ シート、コマンド
network_provider_name ネットワーク プロバイダー "network_provider_name" によって提供されるすべてのオブジェクト ショートカット メニュー、プロパティ シート、コマンド
Printers すべてのプリンター ショートカット メニュー、プロパティ シート
AudioCD CD ドライブ内のオーディオ CD 動詞のみ
Dvd DVD ドライブ (Windows 2000) ショートカット メニュー、プロパティ シート、コマンド

 

メモ

  • ファイル フォルダーの背景ショートカット メニューには、ファイル フォルダー内を右クリックしてアクセスしますが、フォルダーの内容の上にはアクセスできません。
  • "Verbs" は、HKEY_CLASSES_ROOT\Subkey\Shell\Verb の下に登録された特別なコマンドです。
  • Network\Type\# の場合、"#" は 10 進数のネットワーク プロバイダー型コードです。 ネットワーク プロバイダーの種類コードは、ネットワークの種類の上位ワードです。 ネットワークの種類の一覧は、Winnetwk.h ヘッダー ファイル (WNNC_NET_* 値) にあります。 たとえば、WNNC_NET_SHIVAは0x00330000であるため、対応する型サブキーは HKEY_CLASSES_ROOT\Network\Type\51 になります
  • "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}

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