web-dev-qa-db-ja.com

複数のファイルを引数として取るシェルコンテキストメニュー項目を作成するにはどうすればよいですか?

単一のファイルを引数として取るWindowsシェルのコンテキストメニュー項目を作成するのは簡単です。例については、 この質問 を参照してください。

ただし、複数のファイルを引数として取るコンテキストメニュー項目をどのように作成しますか?たとえば、差分マージツール(私の場合はP4Merge)の場合、同じ手法が他のアプリケーションにも適用できることは間違いありません。

P4Mergeをインストールしましたが、コンテキストメニューに項目が自動的に追加されないため、手動で行う必要があります。

私が使用しようとしたとき:

"C:\Program Files\Perforce\p4merge.exe" %1 %2

コマンドラインとしてエラーが発生しました:

エラー:少なくとも2つのファイルが必要です。 1つのファイルのみを開くことはできません。 P4Mergeには、0、2、または3つのファイルが必要です。

私が使用しようとしたとき:

"C:\Program Files\Perforce\p4merge.exe" %0 %1

コマンドラインとして、ファイルごとに1つずつ、P4Mergeの2つのインスタンスを開きました。

正しいファイル名が%0と%1に渡されているようですが、P4Mergeアプリケーションの異なるインスタンスがそれぞれに対して実行されています。

私は現在、シェルコンテキストメニューに項目があり、2つのファイルを選択し、コンテキストメニュー項目を使用してそれらに対して差分を実行できるため、美しく機能するSourceGearのDiffMergeツールを使用しています。レジストリを検索してDiffMergeが使用する引数を確認しようとしましたが、引数を含むDiffMergeコマンドラインが見つかりませんでした。

10
SimonTewsi

SendToメニューにプログラムを追加してみることもできます。

19
surfasb

答えを閲覧すると、簡単な修正はなく、シェル拡張が必要な​​ようです。 DiffMergeのレジストリエントリをもう一度見ると、シェル拡張機能DiffMergeShellExtension64.dllを使用しているようです。 P4Mergeにそのようなシェル拡張機能がない場合、Windowsエクスプローラーのコンテキストメニューで正しく機能させる唯一の方法は、自分でシェル拡張機能を作成することです。

シェル拡張を作成するための完全な馬鹿ガイド Code Projectのシリーズは、シェル拡張を作成するための便利なガイドです。シリーズのパートIIは、一度に複数のファイルを処理する拡張機能の作成に関するものです(まさに私が必要としているもの)。

警告:シェル拡張機能を作成するための完全な馬鹿ガイドでは、CとCOM、ATL(アクティブテンプレートライブラリ)、およびMFC(Microsoft Foundation Classes)を使用しています。したがって、これらのテクノロジに精通していない場合、シェル拡張機能を作成することは、長く、潜在的に困難なプロセスになります。それは間違いなくあなたが1時間でできることではありません。

3
SimonTewsi

あなたは私のプログラムでそれを行うことができます context-menu-launcher(singleinstance)

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"
2
zenden2k