4

シェル拡張である DLL をプログラムで呼び出す方法はありますか? Windows エクスプローラーにシェル拡張機能を登録するソフトウェアを使用しており、そのコンテキスト メニューで利用可能な項目の 1 つを呼び出す必要があります。呼び出したいソフトウェア ソース コードがありません。

編集

このコンテキスト メニューは、Windows エクスプローラーで PDF ファイルを選択したときにのみ表示されます。したがって、dllファイルを渡して呼び出す必要があります。

編集

レジストリ情報:

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}] @="PDFTransformer3.PDFTContextMenu.1"

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\InprocServer32] @="C:\Program Files\ABBYY PDF Transformer 3.0\PDFTContextMenu.dll" "ThreadingModel"="アパートメント"

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\ProgID] @="PDFTransformer3.PDFTContextMenu.1"

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\プログラマブル]

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\VersionIndependentProgID] @="PDFTransformer3.PDFTContextMenu"

編集

ShellExecuteEx私が望む動詞(デフォルトのものではない)で呼び出すことは可能ですか?もしそうなら、どうすれば必要な動詞 (DLL を使用する) を呼び出すことができますか?

それは私がPDFファイルのために呼び出したい動詞です:

ここに画像の説明を入力

4

3 に答える 3

11

DLL は明らかにコンテキスト メニューの拡張機能です。シェルと同じ方法で呼び出す場合は、DLL が実装する IContextMenu インターフェイスをホストする必要があります。数年前、Raymond Chen がこのトピックに関する広範なシリーズを書きました。

IContextMenu をホストする方法

  1. 最初の進出
  2. コンテキスト メニューの表示
  3. 呼び出し場所
  4. 主なコンテキスト
  5. メニュー メッセージの処理
  6. メニューヘルプの表示
  7. デフォルト動詞の呼び出し
  8. デフォルト コマンドの最適化
  9. カスタム コマンドの追加
  10. 複合エクステンション - 下地
  11. 複合拡張 - 複合

最初の 2 つの記事が最も重要です。最初にファイルの IContextMenu インターフェイスを取得する方法を紹介し、次にそのメニューによって提供される 1 つまたは複数のコマンドを呼び出す方法を紹介します。基本的に、IContextMenu インターフェイスを取得し、 CMINVOKCOMMANDINFOEX 構造体を埋めてから、インターフェイスのInvokeCommandメソッドに渡します。この記事TrackPopupMenuでは、ユーザーにメニューを表示するために呼び出し、次に選択内容を使用して構造を埋めていますが、実行するコマンドが正確にわかっている場合は、メニューを表示しなくてもかまいません。(ただし、IContextMenu オブジェクトはおそらく最初にメニューを呼び出すことを想定しているため、メニューを作成する必要QueryContextMenuがある場合があります。)

于 2011-04-19T21:04:30.300 に答える
6

ラファエル、あなたはIContextMenuインターフェースを使うことができます。ここから、インターフェイスから返されたエントリを列挙し、を使用して必要なオプションを実行できます。InvokeCommand

于 2011-04-19T20:43:56.330 に答える
2

これはCOMオブジェクトです。あなたはそれを作成し、それを機能させるために(その背後に十分な実装がある)インターフェースを渡す必要があります。

エクスプローラー(つまりあなた)は、シェル拡張機能にアイテムを別のHMENUに追加するように要求します。次に、Explorer(つまりあなた)はユーザーに応じてメニュー項目を呼び出します。

幸いなことに、シェル内のすべてがインターフェースであるため、好きなように見せかけることができます。反対側からSDKコントラクトを読み取る必要があります。

注意:シェル拡張機能は、エクスプローラーでホストする必要はありませ。多くはそうではありません。CommCtrlの[名前を付けて保存]ダイアログで多くのホストがホストされています。


あなたの場合、それはさらに簡単です。

  • COMオブジェクトを作成する
  • IShellExtInitそのインターフェースを照会し、を呼び出します.Initialize
  • IContextMenuそのインターフェースのクエリ
  • を呼び出しIContextMenu.QueryContextMenu、アイテムをに追加できるようにしますHMENU
  • 電話IContextMenu.Invoke

繰り返しますが、反対側から契約書を読んだ場合。


いくつかの擬似コード:

var
   ClassID: TGUID;
   unk: IUnknown;
   shellext: IShellExtInit;
   dataObject: IDataObject;
   hkeyProgID: HKEY;
   contextMenu: IContextMenu;
   commandInfo: CMINVOKECOMMANDINFO;
begin
   ClassID := ProgIDToClassID('PDFTransformer3.PDFTContextMenu'); 
   unk := CreateComObject(ClassID);

   shellExt := unk as IShellExtInit;

    {
       For shortcut menu extensions, 
          pdtobj identifies the selected file objects,
          hkeyProgID identifies the file type of the object with focus, and 
          pidlFolder is either NULL (for file objects) or specifies the folder 
             for which the shortcut menu is being requested 
             (for folder background shortcut menus).
   }
   shellExt.Initialize(
         nil, //pidlFolder, null for file objects
         dataObject, //IDataObject of the selected file
         hkeyProgID); //HKEY of the file type of the object with focus    

   contextMenu := unk as IContextMenu;
   contextMenu.QueryContextMenu(
         menuHandle, //HMENU, A handle to the shortcut menu. The handler should specify this handle when adding menu items.
         0, //integer, The zero-based position at which to insert the first new menu item.
         100, //The minimum value that the handler can specify for a menu item identifier.
         200, //The maximum value that the handler can specify for a menu item identifier.
         CMF_NORMAL); //optional flags

   contextMenu.InvokeCommand(commandInfo);

それは私がドキュメントを読んで何をすべきかを推測することから得られる限りです。今、私はおしっこをしなければなりません、そしてポータル2をプレイするために家に帰ります

于 2011-04-19T20:43:14.590 に答える