トレーニング
モジュール
財務と運用アプリの拡張機能と拡張機能フレームワークを確認する - Training
財務と運用アプリは拡張機能を使用したカスタマイズができるため、Visual Studio を使用することにより、アプリケーション オブジェクト ツリー (AOT) 内のモデル要素とソース コードに機能を追加できます。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
シェルの機能は、レジストリ エントリと.ini ファイルを使用して拡張できます。 シェルを拡張するこのアプローチは単純であり、多くの目的に適していますが、制限されています。 たとえば、レジストリを使用してファイルの種類にカスタム アイコンを指定すると、その種類のすべてのファイルに同じアイコンが表示されます。 レジストリを使用してシェルを拡張しても、同じ種類のファイルごとにアイコンを変更することはできません。 ファイルを右クリックしたときに表示できる Properties プロパティ シートなど、シェルのその他の側面は、レジストリでまったく変更できません。
シェルを拡張するためのより強力で柔軟なアプローチは、 シェル拡張ハンドラーを実装することです。 これらのハンドラーは、シェルが実行できるさまざまなアクションに対して実装できます。 アクションを実行する前に、シェルは拡張機能ハンドラーに対してクエリを実行し、アクションを変更する機会を与えます。 一般的な例は、ショートカット メニュー拡張機能ハンドラーです。 ファイルの種類に対して実装されている場合は、いずれかのファイルが右クリックされるたびにクエリが実行されます。 ハンドラーでは、ファイルの種類全体に同じセットを設定するのではなく、ファイルごとに追加のメニュー項目を指定できます。
このドキュメントでは、さまざまなシェル アクションを変更できる拡張ハンドラーを実装する方法について説明します。 次のハンドラーは、特定のファイルの種類に関連付けられているので、ファイルごとにを指定できます。
Handler | 説明 |
---|---|
ショートカット メニュー ハンドラー | ファイルのショートカット メニューが表示される前に呼び出されます。 これにより、ファイルごとにショートカット メニューに項目を追加できます。 |
データ ハンドラー | ドラッグ アンド ドロップ操作が dragShell オブジェクトに対して実行されるときに呼び出されます。 これにより、ドロップ ターゲットに追加のクリップボード形式を提供できます。 |
ドロップ ハンドラー | データ オブジェクトがファイル上でドラッグまたはドロップされたときに呼び出されます。 これにより、ファイルをドロップ ターゲットにすることができます。 |
アイコン ハンドラー | ファイルのアイコンが表示される前に呼び出されます。 これにより、ファイルの既定のアイコンをファイルごとにカスタム アイコンに置き換えることができます。 |
プロパティ シート ハンドラー | オブジェクトの Properties プロパティ シートが表示される前に呼び出されます。 これにより、ページを追加または置換できます。 |
サムネイル画像ハンドラー | 項目を表すイメージを提供します。 |
ヒント ハンドラー | ユーザーがオブジェクトの上にマウス ポインターを置いたときにポップアップ テキストを提供します。 |
メタデータ ハンドラー | ファイルに格納されているメタデータ (プロパティ) への読み取りおよび書き込みアクセスを提供します。 これは、詳細ビュー、ヒント、プロパティ ページ、およびグループ化機能を拡張するために使用できます。 |
他のハンドラーは、特定のファイルの種類に関連付けられていないが、一部のシェル操作の前に呼び出されます。
Handler | 説明 |
---|---|
列ハンドラー | フォルダーの詳細ビューを表示する前に、Windows エクスプローラーによって呼び出されます。 これにより、カスタム列を [詳細] ビューに追加できます。 |
フック ハンドラーのコピー | フォルダーまたはプリンター オブジェクトが移動、コピー、削除、または名前変更されようとしているときに呼び出されます。 これにより、操作を承認または拒否できます。 |
ドラッグ アンド ドロップ ハンドラー | マウスの右ボタンでファイルをドラッグしたときに呼び出されます。 これにより、表示されるショートカット メニューを変更できます。 |
アイコン オーバーレイ ハンドラー | ファイルのアイコンが表示される前に呼び出されます。 これにより、ファイルのアイコンのオーバーレイを指定できます。 |
検索ハンドラー | 検索エンジンを起動するために呼び出されます。 これにより、[スタート] メニューまたは Windows エクスプローラーからアクセスできるカスタム検索エンジンを実装できます。 |
特定の拡張機能ハンドラーを実装する方法の詳細については、上記のセクションで説明します。 このドキュメントの残りの部分では、すべてのシェル拡張ハンドラーに共通するいくつかの実装の問題について説明します。
シェル拡張ハンドラー オブジェクトの実装の多くは、その型によって異なります。 ただし、一般的な要素がいくつかあります。 このセクションでは、すべてのシェル拡張ハンドラーによって共有される実装のこれらの側面について説明します。
多くのシェル拡張ハンドラーは、インプロセス コンポーネント オブジェクト モデル (COM) オブジェクトです。 これらは GUID を割り当て、シェル拡張ハンドラーの登録に関するページの説明に従って登録する必要があります。 これらは DLL として実装され、次の標準関数をエクスポートする必要があります。
すべての COM オブジェクトと同様に、シェル拡張ハンドラーは IUnknown インターフェイスと クラス ファクトリを実装する必要があります。 ほとんどの拡張機能ハンドラーでは、Windows XP 以前の IPersistFile インターフェイスまたは IShellExtInit インターフェイスも実装する必要があります。 これらは、Windows Vista の IInitializeWithStream、 IInitializeWithItem 、 および IInitializeWithFile に置き換えられました。 シェルは、これらのインターフェイスを使用してハンドラーを初期化します。
IPersistFile インターフェイスは、次のように実装する必要があります。
以前は、アイコン ハンドラーも IPersistFile を実装するために必要でしたが、これはもはや当てはまらなくなりました。 アイコン ハンドラーの場合、 IPersistFile は省略可能になり、 IInitializeWithItem などの他のインターフェイスが推奨されます。
IShellExtInit インターフェイスは、次の方法で実装する必要があります。
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 インターフェイスには、IUnknown に加えて、IShellExtInit::Initialize という 1 つのメソッドしかありません。 メソッドには、シェルがさまざまな種類の情報を渡すために使用できる 3 つのパラメーターがあります。 渡される値はハンドラーの種類によって異なります。一部は NULL に設定できます。
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_pIDFolder、m_pDataObject、m_szFileName、およびm_hRegKey変数は、渡される情報を格納するために使用されるプライベート変数です。 わかりやすくするために、この例では、データ オブジェクトによって保持されるファイル名が 1 つだけであることを前提としています。 データ オブジェクトから FORMATETC 構造体を取得した後、 DragQueryFile を使用して FORMATETC 構造体の medium.hGlobal メンバーからファイル名を抽出します。 レジストリ キーが渡された場合、 メソッドは RegOpenKeyEx を使用してキーを開き、ハンドルを m_hRegKeyに割り当てます。
ヒントをカスタマイズするには、次の 2 つの方法があります。
名前空間拡張機能の固定文字列を表示するには、名前空間拡張機能の {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}、pid は FMTID/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 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 の時点では、 IPropertySetStorage は IPropertyStore を優先して非推奨となりました。
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 |
メモ:
特定のハンドラーを有効にするには、ハンドラーの名前を持つ拡張ハンドラー型キーの下にサブキーを作成します。 シェルはハンドラーの名前を使用しませんが、その型サブキーの他のすべての名前とは異なる必要があります。 名前サブキーの既定値をハンドラーの 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 システムに従う必要があります。
トレーニング
モジュール
財務と運用アプリの拡張機能と拡張機能フレームワークを確認する - Training
財務と運用アプリは拡張機能を使用したカスタマイズができるため、Visual Studio を使用することにより、アプリケーション オブジェクト ツリー (AOT) 内のモデル要素とソース コードに機能を追加できます。