シェルオープン経由で呼び出されたDelphiプログラムで複数のファイルを開く方法
-
03-07-2019 - |
質問
現在使用しているもの:
if ParamStr(1)<>'%1' then
begin
address.Text:=ParamStr(1);
autoconfigfile;
end;
ファイルの関連付けを使用してファイルを開くために使用されたファイルの名前を取得します。
ここで、複数のファイルを操作する機能を開発したいと考えています。 つまり5つのファイルを選択して右クリックし、「EncryptionSystem」で開くを選択した場合。 レジストリエントリがあります:
reg.OpenKey('*\shell\Encrypt\command', true);
reg.WriteString('','C:\Program Files\EncryptionSystem\EncryptionSystem.exe "%1"');
reg.CloseKey;
右クリックで開く機能をすべてのファイルに追加するには。その後、検出する機能が必要です
- ファイル数
- 各ファイルのパス名
解決
一度に複数のファイルを開こうとすると、通常、登録されたプログラムの複数のインスタンスが取得され、それぞれがファイルの1つを開きます。
最近の質問から判断
どうすればプログラムのインスタンスが1つ実行されていますか?
方法Delphiプログラムの1つのインスタンスから別のインスタンスに文字列を送信しますか?
プログラムの複数のインスタンスを許可したくないので、その設計決定を再検討するか、2番目の質問への回答に記載されている方法のいずれかを実装して、セカンダリインスタンスのコマンドラインパラメータを送信する必要がありますプログラムの最初のインスタンスへ。ここでは、最初のインスタンスが他のインスタンスからデータを受信する準備がまだ整っていない場合があるため、タイミングが重要であることに注意してください。特に、メインフォームのウィンドウハンドル、またはパイプベースまたはファイルベースの何らかの通信メカニズムを使用するソリューションでは、最初のインスタンスの準備が完了するまで待機する必要があります。したがって、単純にプログラムの複数のインスタンスを許可する方がはるかに簡単かもしれません。
このマイクロソフトサポート技術情報のエントリを調べるか、詳細を検索することもできます。 DDE Execute コマンドについて。
編集:&quot;%*&quot;で試すこともできます。 &quot;%1&quot;の代わりに「Old New Thing」で詳しく説明されているように、レジストリキーでコメント回答gabr が言及されました。私はこれをテストしていませんが、うまくいくようです。
他のヒント
他のすべてに加えて、%1の代わりに%lを使用する必要があります。これにより、プログラムは短い(DOS 8.3)名前ではなく、ファイルの完全な(長い)名前を取得します。
編集:コメントでのロブの質問への回答
GoogleまたはMSDN検索を使用して '%l'および '%1'(パーセント記号を含む)を検索することはほとんど不可能と思われます。 :(しかし、私はかなり良い説明を見つけました 古い新物-'%1'は、プログラムが長いファイル名をサポートしているかどうかを自動検出し、短い名前または長い名前を渡します。すべての最新システムは、exeが見つからない場合を除き、長い名前を渡すようです(少なくとも、それがRaymondの公開を理解する方法です)。
コメントをさらに下にスクロールすると(ページで「%l」を検索して)、サポートされているすべてのパラメーターのリストが表示されます。 インターネットアーカイブ)。そのページにはMicrosoftのドキュメントへの参照も含まれていないため、信頼できるリンクを提供することはできません:(
ロブ、質問してくれてありがとう-以前よりも%1 /%lのことをよく知った:) +1。
本当に欲しいものがわからない。ただし、次のコマンドでパラメーターの数を見つけることができます。
ParamCount;
各パラメーターは次のように見つかります
ParamStr(1);
ParamStr(2);
ParamStr(3);
ParamCountまで。
登録するのは%1のみであることに注意してください。
レジストリで%1%2%3%4%5などを試します。
これが失敗する他の原因を確認するためにシェル拡張を使用したことはありません。私がやったことは、ファイルの関連付けを登録するだけで、期待どおりに動作します。