シェル拡張機能ハンドラー オブジェクトは、シェルで使用する前に登録する必要があります。 このトピックでは、シェル拡張ハンドラーを登録する方法の一般的な説明です。
シェル拡張ハンドラーを作成または変更する場合は、いつでも、変更を加えたことをシステムに通知することが重要です。 これを行うには、 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_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}
関連トピック