シェル拡張機能ハンドラーの作成

シェルの機能は、レジストリ エントリと.ini ファイルを使用して拡張できます。 シェルを拡張するこのアプローチは単純であり、多くの目的に適していますが、制限されています。 たとえば、レジストリを使用してファイルの種類にカスタム アイコンを指定すると、その種類のすべてのファイルに同じアイコンが表示されます。 レジストリを使用してシェルを拡張しても、同じ種類のファイルごとにアイコンを変更することはできません。 ファイルを右クリックしたときに表示できる Properties プロパティ シートなど、シェルのその他の側面は、レジストリでまったく変更できません。

シェルを拡張するためのより強力で柔軟なアプローチは、 シェル拡張ハンドラーを実装することです。 これらのハンドラーは、シェルが実行できるさまざまなアクションに対して実装できます。 アクションを実行する前に、シェルは拡張機能ハンドラーに対してクエリを実行し、アクションを変更する機会を与えます。 一般的な例は、ショートカット メニュー拡張機能ハンドラーです。 ファイルの種類に対して実装されている場合は、いずれかのファイルが右クリックされるたびにクエリが実行されます。 ハンドラーでは、ファイルの種類全体に同じセットを設定するのではなく、ファイルごとに追加のメニュー項目を指定できます。

このドキュメントでは、さまざまなシェル アクションを変更できる拡張ハンドラーを実装する方法について説明します。 次のハンドラーは、特定のファイルの種類に関連付けられているので、ファイルごとにを指定できます。

Handler 説明
ショートカット メニュー ハンドラー ファイルのショートカット メニューが表示される前に呼び出されます。 これにより、ファイルごとにショートカット メニューに項目を追加できます。
データ ハンドラー ドラッグ アンド ドロップ操作が dragShell オブジェクトに対して実行されるときに呼び出されます。 これにより、ドロップ ターゲットに追加のクリップボード形式を提供できます。
ドロップ ハンドラー データ オブジェクトがファイル上でドラッグまたはドロップされたときに呼び出されます。 これにより、ファイルをドロップ ターゲットにすることができます。
アイコン ハンドラー ファイルのアイコンが表示される前に呼び出されます。 これにより、ファイルの既定のアイコンをファイルごとにカスタム アイコンに置き換えることができます。
プロパティ シート ハンドラー オブジェクトの Properties プロパティ シートが表示される前に呼び出されます。 これにより、ページを追加または置換できます。
サムネイル画像ハンドラー 項目を表すイメージを提供します。
ヒント ハンドラー ユーザーがオブジェクトの上にマウス ポインターを置いたときにポップアップ テキストを提供します。
メタデータ ハンドラー ファイルに格納されているメタデータ (プロパティ) への読み取りおよび書き込みアクセスを提供します。 これは、詳細ビュー、ヒント、プロパティ ページ、およびグループ化機能を拡張するために使用できます。

 

他のハンドラーは、特定のファイルの種類に関連付けられていないが、一部のシェル操作の前に呼び出されます。

Handler 説明
列ハンドラー フォルダーの詳細ビューを表示する前に、Windows エクスプローラーによって呼び出されます。 これにより、カスタム列を [詳細] ビューに追加できます。
フック ハンドラーのコピー フォルダーまたはプリンター オブジェクトが移動、コピー、削除、または名前変更されようとしているときに呼び出されます。 これにより、操作を承認または拒否できます。
ドラッグ アンド ドロップ ハンドラー マウスの右ボタンでファイルをドラッグしたときに呼び出されます。 これにより、表示されるショートカット メニューを変更できます。
アイコン オーバーレイ ハンドラー ファイルのアイコンが表示される前に呼び出されます。 これにより、ファイルのアイコンのオーバーレイを指定できます。
検索ハンドラー 検索エンジンを起動するために呼び出されます。 これにより、[スタート] メニューまたは Windows エクスプローラーからアクセスできるカスタム検索エンジンを実装できます。

 

特定の拡張機能ハンドラーを実装する方法の詳細については、上記のセクションで説明します。 このドキュメントの残りの部分では、すべてのシェル拡張ハンドラーに共通するいくつかの実装の問題について説明します。

シェル拡張ハンドラーの実装

シェル拡張ハンドラー オブジェクトの実装の多くは、その型によって異なります。 ただし、一般的な要素がいくつかあります。 このセクションでは、すべてのシェル拡張ハンドラーによって共有される実装のこれらの側面について説明します。

多くのシェル拡張ハンドラーは、インプロセス コンポーネント オブジェクト モデル (COM) オブジェクトです。 これらは GUID を割り当て、シェル拡張ハンドラーの登録に関するページの説明に従って登録する必要があります。 これらは DLL として実装され、次の標準関数をエクスポートする必要があります。

  • DllMain。 DLL への標準エントリ ポイント。
  • DllGetClassObject。 オブジェクトのクラス ファクトリを公開します。
  • DllCanUnloadNow。 COM はこの関数を呼び出して、オブジェクトがクライアントにサービスを提供しているかどうかを判断します。 そうでない場合、システムは DLL をアンロードし、関連付けられているメモリを解放できます。

すべての COM オブジェクトと同様に、シェル拡張ハンドラーは IUnknown インターフェイスと クラス ファクトリを実装する必要があります。 ほとんどの拡張機能ハンドラーでは、Windows XP 以前の IPersistFile インターフェイスまたは IShellExtInit インターフェイスも実装する必要があります。 これらは、Windows Vista の IInitializeWithStreamIInitializeWithItemおよび IInitializeWithFile に置き換えられました。 シェルは、これらのインターフェイスを使用してハンドラーを初期化します。

IPersistFile インターフェイスは、次のように実装する必要があります。

  • データ ハンドラー
  • ドロップ ハンドラー

以前は、アイコン ハンドラーも IPersistFile を実装するために必要でしたが、これはもはや当てはまらなくなりました。 アイコン ハンドラーの場合、 IPersistFile は省略可能になり、 IInitializeWithItem などの他のインターフェイスが推奨されます。

IShellExtInit インターフェイスは、次の方法で実装する必要があります。

  • ショートカット メニュー ハンドラー
  • ドラッグ アンド ドロップ ハンドラー
  • プロパティ シート ハンドラー

IPersistFile の実装

IPersistFile インターフェイスは、オブジェクトの読み込み元またはディスク ファイルへの保存を許可することを目的としています。 IUnknown に加えて 6 つのメソッドがあり、そのうち 5 つのメソッドと、IPersist から継承する GetClassID メソッドがあります。 シェル拡張機能では、 IPersist はシェル拡張ハンドラー オブジェクトの初期化にのみ使用されます。 通常、ディスクから読み取ったりディスクに書き込んだりする必要がないため、 GetClassID メソッドと Load メソッドのみが非トークン実装を必要とします。

シェルは最初に GetClassID を 呼び出し、関数は拡張ハンドラー オブジェクトのクラス識別子 (CLSID) を返します。 次に、シェルは Load を呼び出し、2 つの値を渡します。 最初の pszFileName は、シェルが操作しようとしているファイルまたはフォルダーの名前を持つ Unicode 文字列です。 2 つ目は dwMode で、ファイル アクセス モードを示します。 通常、ファイルにアクセスする必要がないため、 dwMode は通常 0 です。 メソッドは、後で参照するために必要に応じてこれらの値を格納します。

次のコード フラグメントは、一般的な Shell 拡張ハンドラーが GetClassID メソッドと Load メソッドを実装する方法を示しています。 ANSI または Unicode を処理するように設計されています。 CLSID_SampleExtHandlerは拡張ハンドラー オブジェクトの GUID であり、CSampleExtHandler は インターフェイスの実装に使用されるクラスの名前です。 m_szFileName変数とm_dwMode変数は、ファイルの名前とアクセス フラグを格納するために使用されるプライベート変数です。

wchar_t m_szFileName[MAX_PATH];    // The file name
DWORD m_dwMode;                  // The file access mode

CSampleExtHandler::GetClassID(CLSID *pCLSID)
{
    *pCLSID = CLSID_SampleExtHandler;
}

CSampleExtHandler::Load(PCWSTR pszFile, DWORD dwMode)
{
    m_dwMode = dwMode;
    return StringCchCopy(_szFileName, ARRAYSIZE(m_szFileName), pszFile);
}

IShellExtInit の実装

IShellExtInit インターフェイスには、IUnknown に加えて、IShellExtInit::Initialize という 1 つのメソッドしかありません。 メソッドには、シェルがさまざまな種類の情報を渡すために使用できる 3 つのパラメーターがあります。 渡される値はハンドラーの種類によって異なります。一部は NULL に設定できます。

  • pIDFolder は、アイテム識別子リスト (PIDL) へのフォルダーのポインターを保持します。 プロパティ シートの拡張子の場合は NULL です。 ショートカット メニュー拡張機能の場合、ショートカット メニューが表示されている項目を含むフォルダーの PIDL です。 既定以外のドラッグ アンド ドロップ ハンドラーの場合は、ターゲット フォルダーの PIDL です。
  • pDataObject は、データ オブジェクトの IDataObject インターフェイスへのポインターを保持します。 データ オブジェクトは、1 つ以上のファイル名 をCF_HDROP 形式で保持します。
  • hRegKey は、ファイル オブジェクトまたはフォルダーの種類のレジストリ キーを保持します。

IShellExtInit::Initialize メソッドは、後で使用するために必要に応じて、ファイル名、IDataObject ポインター、およびレジストリ キーを格納します。 次のコード フラグメントは、 IShellExtInit::Initialize の実装を示しています。 わかりやすくするために、この例では、データ オブジェクトに 1 つのファイルのみが含まれていることを前提としています。 一般に、それぞれが抽出する必要がある複数のファイルが含まれている場合があります。

LPCITEMIDLIST  m_pIDFolder;           //The folder's PIDL
wchar_t        m_szFile[MAX_PATH];    //The file name
IDataObject   *m_pDataObj;            //The IDataObject pointer
HKEY           m_hRegKey;             //The file or folder's registry key

STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, 
                                   IDataObject *pDataObj, 
                                   HKEY hRegKey) 
{ 
    // If Initialize has already been called, release the old PIDL
    ILFree(m_pIDFolder);
    m_pIDFolder = nullptr;

    // Store the new PIDL.
    if (pIDFolder)
    {
        m_pIDFolder = ILClone(pIDFolder);
    }
    
    // If Initialize has already been called, release the old
    // IDataObject pointer.
    if (m_pDataObj)
    { 
        m_pDataObj->Release(); 
    }
     
    // If a data object pointer was passed in, save it and
    // extract the file name. 
    if (pDataObj) 
    { 
        m_pDataObj = pDataObj; 
        pDataObj->AddRef(); 
      
        STGMEDIUM   medium;
        FORMATETC   fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
        UINT        uCount;

        if (SUCCEEDED(m_pDataObj->GetData(&fe, &medium)))
        {
            // Get the count of files dropped.
            uCount = DragQueryFile((HDROP)medium.hGlobal, (UINT)-1, NULL, 0);

            // Get the first file name from the CF_HDROP.
            if (uCount)
                DragQueryFile((HDROP)medium.hGlobal, 0, m_szFile, 
                              sizeof(m_szFile)/sizeof(TCHAR));

            ReleaseStgMedium(&medium);
        }
    }

    // Duplicate the registry handle. 
    if (hRegKey) 
        RegOpenKeyEx(hRegKey, nullptr, 0L, MAXIMUM_ALLOWED, &m_hRegKey); 
    return S_OK; 
}

CSampleExtHandler は、 インターフェイスの実装に使用されるクラスの名前です。 m_pIDFolderm_pDataObjectm_szFileNameおよびm_hRegKey変数は、渡される情報を格納するために使用されるプライベート変数です。 わかりやすくするために、この例では、データ オブジェクトによって保持されるファイル名が 1 つだけであることを前提としています。 データ オブジェクトから FORMATETC 構造体を取得した後、 DragQueryFile を使用して FORMATETC 構造体の medium.hGlobal メンバーからファイル名を抽出します。 レジストリ キーが渡された場合、 メソッドは RegOpenKeyEx を使用してキーを開き、ハンドルを m_hRegKeyに割り当てます。

ヒントのカスタマイズ

ヒントをカスタマイズするには、次の 2 つの方法があります。

  • IQueryInfo をサポートするオブジェクトを実装し、そのオブジェクトをレジストリの適切なサブキーに登録します (後述のシェル拡張ハンドラーの登録を参照してください)。
  • 固定文字列または表示する特定のファイル プロパティの一覧を指定します。

名前空間拡張機能の固定文字列を表示するには、名前空間拡張機能の {CLSID} キーに というInfoTip名前のエントリを作成します。 この例に示すように、そのエントリの値を表示するリテラル文字列、またはそのリソース内のリソースとインデックスを指定する間接文字列 (ローカライズの目的で) のいずれかに設定します。

HKEY_CLASSES_ROOT
   CLSID
      {CLSID}
         InfoTip = InfoTip string for your namespace extension

ファイルの種類の固定文字列を表示するには、そのファイルの種類の ProgID キーで というInfoTip名前のエントリを作成します。 この例に示すように、そのエントリの値を、表示するリテラル文字列、またはそのリソース内のリソースとインデックスを指定する間接文字列 (ローカライズ目的) のいずれかに設定します。

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = Resource.dll, 3

シェルで特定のファイルの種類のヒントに特定のファイル プロパティを表示する場合は、そのファイルの種類の ProgID キーに というInfoTipエントリを作成します。 そのエントリの値を、標準プロパティ名、書式識別子 (FMTID)、プロパティ識別子 (PID) ペア、またはその両方のセミコロンで区切られたリストに設定します。 プロパティ リスト文字列として識別するには、この値は "prop:" で始まる必要があります。 "prop:" を省略すると、値はリテラル文字列と見なされ、そのように表示されます。

次の例では、 propname は正規のプロパティ名 (System.Date など) で 、{fmtid}、pidFMTID/PID ペアです。

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = prop:propname;propname;{fmtid},pid;{fmtid},pid

次のプロパティ名を使用できます。

プロパティ名 説明 取得元
Author ドキュメントの作成者 PIDSI_AUTHOR
タイトル ドキュメントのタイトル PIDSI_TITLE
サブジェクト 件名の概要 PIDSI_SUBJECT
コメント ドキュメント コメント PIDSI_COMMENT またはフォルダー/ドライバーのプロパティ
PageCount ページ数 PIDSI_PAGECOUNT
名前 フレンドリ名 標準フォルダー ビュー
OriginalLocation 元のファイルの場所 Briefcase フォルダーとごみ箱フォルダー
DateDeleted ファイルが削除された日付 ごみ箱フォルダー
ファイルの種類 標準フォルダーの詳細ビュー
サイズ ファイルのサイズ 標準フォルダーの詳細ビュー
SyncCopyIn OriginalLocation と同じ OriginalLocation と同じ
修正済み 最終更新日 標準フォルダーの詳細ビュー
作成済み 作成日 標準フォルダーの詳細ビュー
アクセス方法 最後にアクセスされた日付 標準フォルダーの詳細ビュー
InFolder ファイルを含むディレクトリ ドキュメントの検索結果
順位 検索の一致の品質 ドキュメントの検索結果
FreeSpace 使用可能な記憶域 ディスク ドライブ
NumberOfVisits アクセス数 お気に入りのフォルダー
属性 ファイル属性 標準フォルダーの詳細ビュー
[会社] 会社名 PIDDSI_COMPANY
カテゴリ ドキュメント カテゴリ PIDDSI_CATEGORY
著作権 メディアの著作権 PIDMSI_COPYRIGHT
HTMLInfoTipFile HTML ヒント ファイル フォルダーのDesktop.ini ファイル

 

シェル拡張機能ハンドラーを使用した Windows 検索の強化

シェル拡張ハンドラーを使用して、Windows Search プロトコル ハンドラーによって提供されるユーザー エクスペリエンスを向上させることができます。 このような拡張機能を有効にするには、サポートする Shell 拡張機能ハンドラーを、データ ソースとして検索プロトコル ハンドラーと統合するように設計する必要があります。 シェル拡張機能ハンドラーとの統合を通じて Windows Search プロトコル ハンドラーを拡張する方法については、「 アイコン、プレビュー、ショートカット メニューの追加」を参照してください。 Windows Search プロトコル ハンドラーの詳細については、「 プロトコル ハンドラーの開発」を参照してください。

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

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

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

すべての COM オブジェクトと同様に、UUIDGEN.exeなどのツールを使用してハンドラーの GUID を作成する必要があります。 HKEY_CLASSES_ROOTCLSIDの下\にキーを作成します。その名前は GUID の文字列形式です。 シェル拡張ハンドラーはインプロセス サーバーであるため、GUID キーの下に InProcServer32 キーを作成し、既定値をハンドラーの DLL のパスに設定する必要があります。 アパートメント スレッド モデルを使用します。

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

ハンドラー名

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

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

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

次のハンドラーでは、シェル拡張機能の CLSID の文字列バージョンを名前とする "Handler Subkey name" キーの下にサブキーを作成します。 複数のサブキーを作成することで、ハンドラー サブキー名キーの下に複数の拡張機能を登録できます。

Handler インターフェイス ハンドラー サブキー名
ショートカット メニュー ハンドラー IContextMenu ContextMenuHandlers
Copyhook ハンドラー ICopyHook CopyHookHandlers
ドラッグ アンド ドロップ ハンドラー IContextMenu DragDropHandlers
プロパティ シート ハンドラー IShellPropSheetExt PropertySheetHandlers
列プロバイダー ハンドラー (Windows Vista では非推奨) IColumnProvider ColumnHandlers

 

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

Handler インターフェイス ハンドラー サブキー名
データ ハンドラー Idataobject DataHandler
ドロップ ハンドラー IDropTarget DropHandler
アイコン ハンドラー IExtractIconA/W IconHandler
イメージ ハンドラー IExtractImage {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
サムネイル画像ハンドラー 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 IPropertyStore PropertyHandler
Metadata IPropertySetStorage (Windows Vista では非推奨) PropertyHandler
スタート メニューにピン留めする IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
タスク バーにピン留め {90AA3A4E-1CBA-4233-B8BB-535773D48449}

 

[ スタート メニューにピン留めする] と [ タスク バーにピン留め する] を項目のショートカット メニューに追加するために指定したサブキーは、 IsShortCut エントリを含むファイルの種類にのみ必要です。

Windows Vista で列プロバイダー ハンドラーのサポートが削除されました。 また、Windows Vista の時点では、 IPropertySetStorageIPropertyStore を優先して非推奨となりました。

IExtractImage は引き続きサポートされますが、Windows Vista 以降では IThumbnailProvider が優先されます。

定義済みのシェル オブジェクト

シェルは、 HKEY_CLASSES_ROOTの下 に追加のオブジェクトを定義します。これは、ファイルの種類と同じ方法で拡張できます。 たとえば、すべてのファイルのプロパティ シート ハンドラーを追加するには、 PropertySheetHandlers キーに登録できます。

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

次の表は、拡張機能ハンドラーを登録できる HKEY_CLASSES_ROOT のさまざまなサブキーを示しています。 一覧表示されているすべてのサブキーで、多くの拡張機能ハンドラーを登録できないことに注意してください。 詳細については、特定のハンドラーのドキュメントを参照してください。

サブキー 説明 使用可能なハンドラー バージョン
* すべてのファイル ショートカット メニュー、プロパティ シート、動詞 (下記参照) すべて
AllFileSystemObjects すべてのファイルとファイル フォルダー ショートカット メニュー、プロパティ シート、動詞 4.71
フォルダー すべてのフォルダー ショートカット メニュー、プロパティ シート、動詞 すべて
ディレクトリ ファイル フォルダー ショートカット メニュー、プロパティ シート、動詞 すべて
Directory\Background ファイル フォルダーの背景 ショートカット メニューのみ 4.71
ドライブ MyComputer のすべてのドライブ ("C:\" など) ショートカット メニュー、プロパティ シート、動詞 すべて
Network ネットワーク全体 ([マイ ネットワークの場所] の下) ショートカット メニュー、プロパティ シート、動詞 すべて
Network\Type\# # 型のすべてのオブジェクト (以下を参照) ショートカット メニュー、プロパティ シート、動詞 4.71
Netshare すべてのネットワーク共有 ショートカット メニュー、プロパティ シート、動詞 4.71
NetServer すべてのネットワーク サーバー ショートカット メニュー、プロパティ シート、動詞 4.71
network_provider_name ネットワーク プロバイダー "network_provider_name" によって提供されるすべてのオブジェクト ショートカット メニュー、プロパティ シート、動詞 すべて
プリンター すべてのプリンタ ショートカット メニュー、プロパティ シート すべて
AudioCD CD ドライブのオーディオ CD 動詞のみ すべて
Dvd DVD ドライブ (Windows 2000) ショートカット メニュー、プロパティ シート、動詞 4.71

 

メモ:

  • ファイル フォルダーの背景ショートカット メニューにアクセスするには、ファイル フォルダー内を右クリックしますが、フォルダーの内容にアクセスすることはできません。
  • "動詞" は、 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}

このセクションで説明する登録手順は、すべての Windows システムに従う必要があります。

In-Process拡張機能の実装に関するガイダンス