17

これはよくある質問のように思えましたが、検索を行った後、実際に答えを見つけることができませんでした. ここにこれに関する記事があります:

http://www.codeproject.com/KB/shell/shellextguide1.aspx

ただし、これは非常に古いバージョンの Visual Studio 用です。私は VS 2008 を使用しているため、指示とインターフェイスが表示されているものと一致していないようです。

C++ を使用して、拡張子が .GZ のファイルのコンテキスト メニューを作成する単純なシェル拡張機能を作成したいと考えています。これらのファイルを右クリックすると、コンテキスト メニュー項目をクリックして、そのファイルに対して何らかの操作を行うためのコールバックをコードに含めることができるはずです。

他のコンテキスト メニュー項目は、なんらかのアクションを実行する前にユーザー入力を受け入れるために modless ダイアログを生成するようなことを行います。

私が見たところ、これには ATL が使用されていますが、ATL を使用したことがないため、すべてのオブジェクト タイプとインターフェイスが非常にわかりにくくなっています。読むべき適切なチュートリアルやドキュメントがあれば、それほど悪くはありません。

誰でも私を助けることができますか?10年以上前のチュートリアルはありませんか?

4

1 に答える 1

24

シェル拡張の書き方を正確に説明することはできませんが、いくつかのヒントを提供します。シェル拡張機能を作成すると、はるかに単純な「レジストリのみ」の方法よりも大きな利点がいくつかあります。

  • シェル拡張機能を使用すると、選択したファイルにより関連性の高いコンテキスト メニュー項目 (またはサブメニュー) を動的に作成できます。たとえば、zip ファイルのシェル拡張を作成している場合、コンテキスト メニュー内にサブメニューを作成して、zip の内容全体を表示することができます。
  • 複数のファイルを同時に処理できます。これは、パフォーマンスの目的だけでなく、ファイルごとではなく、選択全体に基づいて何をすべきかを判断できるという利点もあります。

シェル拡張機能の欠点のいくつかは次のとおりです。

  • 複雑さが大幅に増加します。これを機能させるために、これに多くの労力を費やす準備をしてください。パソコンの隣に家庭用エスプレッソ マシンを設置するか、誰かにコーヒーを淹れてもらいましょう。

  • デバッグの難易度が大幅に向上しました。コーヒーについても同様です。

デバッグが非常に難しいため、シェル拡張機能を記述するのは困難です。

  • シェル拡張機能はプロセスによって読み込まれ、 Explorer の特定の構成を行わない場合は、シェル拡張機能の新しいバージョンをインストールできるように、プロセスexplorer.exeを強制終了する必要があります。explorer.exeExplorer が使用しなくなった DLL をアンロードする方法がありますが、これは開発マシンでのみ実行し、展開ターゲットでは実行しないでください。

    1. RegEdit で、次のキーを参照します。

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer

    2. 「AlwaysUnloadDLL」という新しい DWORD キーを追加し、その値を 1 に設定します。

    3. エクスプローラーを再起動します。

    これはほとんどの場合に機能しますが、シェル拡張がアンロードされていないために、エクスプローラーを閉じる必要がある場合もあります。

  • シェル拡張機能は他のアプリケーションによって読み込まれる可能性があることに注意してください。たとえば、アプリケーションの「ファイルを開く」ダイアログでファイルを右クリックすると、シェル拡張機能は Explorer ではなくそのアプリケーションに読み込まれます。

  • シェル拡張機能が実行時エラーを引き起こした場合、結果としてコンテキスト メニュー項目が表示されないことがよくあります。シェル拡張機能の読み込みに失敗した、または実行時エラーが発生したと通知されることはほとんどありません。

  • 構成は難しい場合があります。インストールしても、レジストリ データをいくつかの場所に作成する必要があり、コンテキスト メニューを表示する場所によっては、Windows のバージョンによってレジストリ内の場所が異なる場合があります。

必要な作業:

  • Visual Studio には、シェル拡張機能を作成するためのショートカットがいくつか用意されていますが、基本的には COM DLL を作成する必要があります。コンテキスト メニュー項目のシェル拡張は、インターフェイスとインターフェイスの両方を実装する必要があります。IContextMenuIShellExtInit
  • メソッドではIShellExtInit::Initialize()、選択したファイルをIDataObjectパラメーターから取得できます。メモリからのデータは「ドラッグ アンド ドロップ」形式であるため、HDROPからハンドルを取得し、IDataObjectそこからファイルを照会する必要があります (これはメモリからのものであり、実際にはここで説明したものとは異なる場合があるため、先に進みます慎重に)。
  • DLL を「インストール」する準備ができたら、DLL をどこかにコピーし、実行regsvr32して登録されていることを確認する必要があります。
  • このガイドに従って、レジストリ キーを配置する場所を確認してください。
  • 64 ビットの Windows では問題が発生する可能性があります。32 ビットの DLL をビルドすると、64 ビットの Explorer にロードされない可能性があります。
  • DLL には、実際には2 つのGUID が関連付けられています。どのように機能するか正確には覚えていませんが、1 つの GUID は DLL 自体を参照し、もう 1 つの GUID は実際のシェル拡張を参照しています。GUID が必要なレジストリにキーを作成するときは、実際のシェル拡張機能の GUID を使用してください。

考慮されたすべてのこと…(tl;dr)

シェル拡張に価値があるかどうかのコストを比較検討してください。選択したファイルに基づいて動的にメニュー項目を作成したい場合は、シェル拡張が唯一の方法かもしれません。すべてのファイルを同時に処理したい場合は、おそらくシェル拡張も必要になるでしょう。

コンテキスト メニュー メソッドの代わりに、ユーザーのデスクトップなどにドラッグ アンド ドロップ ターゲットを設定することもできます。シェル拡張機能は多くの場合、その価値よりもはるかに手間がかかるため、ユーザーにファイルをアプリケーションに送信させる他の方法を検討してください。私はこれを難しい方法で見つけましたが、他の人もそうだと思います。

于 2012-01-11T20:34:39.093 に答える