次の方法で共有


コンテキストメニューCOMオブジェクトの実装

コンテキストメニューの拡張機能は、インプロセスサーバーとして実装されるCOMオブジェクトです。 コンテキストメニューの拡張機能は、IShellExtInitインターフェイスとIContextMenuインターフェイスを実装する必要があります。 コンテキストメニューの拡張機能は、コンテキストメニューの拡張機能が登録されているクラスのオブジェクトのコンテキストメニューをユーザーが表示するときにインスタンス化されます。

IShellExtInitの実装

コンテキストメニューの拡張機能COMオブジェクトがインスタンス化されると、IShellExtInit::Initialize メソッドが呼び出されます。 IShellExtInit::Initializeは、コンテキストメニューが適用されるディレクトリオブジェクトに関連するデータを含むIDataObjectオブジェクトを使用して、コンテキストメニューの拡張機能を提供します。

IDataObjectには、CFSTR_DSOBJECTNAMES形式のデータが含まれています。 CFSTR_DSOBJECTNAMESデータ形式は、DSOBJECTNAMES構造体を含むHGLOBALです。 DSOBJECTNAMES構造体には、プロパティシート拡張機能が適用されるディレクトリオブジェクトに関するデータが含まれています。

IDataObjectには、CFSTR_DS_DISPLAY_SPEC_OPTIONS形式のデータも含まれています。 CFSTR_DS_DISPLAY_SPEC_OPTIONSデータ形式は、DSDISPLAYSPECOPTIONS構造体を含むHGLOBALです。 DSDISPLAYSPECOPTIONSには、拡張機能で使用する構成データが含まれています。

IShellExtInit::InitializeからS_OK以外の値が返された場合、コンテキストメニュー拡張機能は使用されません。

IShellExtInit::Initialize メソッドのpidlFolderパラメーターとhkeyProgIDパラメーターは使用されません。

IContextMenuの実装

IShellExtInit::Initializeが返された後、 IContextMenu::QueryContextMenuメソッドを呼び出して、コンテキストメニュー拡張機能によって追加されるメニュー項目または項目を取得します。 QueryContextMenuの実装は非常に簡単です。 コンテキストメニュー拡張機能は、InsertMenuItemまたは同様の関数を使用してメニュー項目を追加します。 メニューコマンド識別子はidCmdLast以上である必要があり、idCmdFirst未満である必要があります。 QueryContextMenuは、メニューに追加された最大の数値識別子を返す必要があります。 メニューコマンド識別子を割り当てる最適な方法は、0から開始して順番に作業することです。 コンテキストメニュー拡張機能がメニュー項目を必要としない場合は、メニューに項目を追加せず、QueryContextMenuから0を返すだけです。

IContextMenu :: GetCommandStringは、メニュー項目に表示されるヘルプテキストなど、メニュー項目のテキストデータを取得するために呼び出されます。 拡張機能がANSI文字列を使用しているときに、コンテキストメニューのホストがUnicode文字列を使用する可能性があります。 このため、GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA およびGCS_VERBW、の場合は個別に処理する必要があります。 このメソッドの実装は省略可能です。

IContextMenu :: InvokeCommandは、コンテキストメニューの拡張機能によってインストールされたメニュー項目の1つが選択されたときに呼び出されます。 コンテキストメニューは、このメソッドに応答して必要なアクションを実行または開始します。