0

この方法で1つのファイルを開く方法と、EXEまたはアプリケーションのショートカットにドラッグアンドドロップされたファイルの数を取得する方法を知っています。

しかし、ファイルごとに1つずつ、アプリケーションの複数のインスタンスを実行するにはどうすればよいでしょうか。

4

3 に答える 3

4

これを.dprファイルのコードの先頭に置きます。

if ParamCount>1 then
begin
  for i := 1 to ParamCount do
    ShellExecute(0, nil, PChar(ParamStr(0)), PChar('"'+ParamStr(i)+'"'), 
        nil, SW_SHOWDEFAULT);
  exit;
end;

これは、複数のコマンドライン引数があるかどうかを確認します。その場合、それぞれが新しいプロセスに渡され、このプロセスは終了します。

引数2をNに渡して、このプロセスに引数1を処理させることができると思います。しかし、数学的な性質であるため、このバージョンの対称性は私にとって魅力的です。

于 2013-03-12T18:23:49.890 に答える
2

ドロップペンドファイルがパラメーターとして渡される限り、渡されたパラメーターごとにアプリケーションの新しいインスタンスを実行できます。
以下に示す例では、最初のパラメーターはエクスプローラーのDrog&Dropを介して開始されたアプリケーションによって処理され、アプリケーションの新しいインスタンスが追加のパラメーターに対して実行されます。

program Project1;

uses
  Forms, Shellapi,Messages,Windows,
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
var
i:Integer;
begin
  for I := 2 to Paramcount  do
      ShellExecute(0,'OPEN',PChar(Paramstr(0)),PChar(Paramstr(i)),'',sw_Show);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

Form2のコードの最も簡単な例は

procedure TForm2.FormCreate(Sender: TObject);
begin
  Caption := ParamStr(1); 
  // whatever should be done with the dropped file
end;
于 2013-03-12T18:26:46.103 に答える
1

アプリのアイコンまたはショートカットにドロップされた各ファイルは、コマンドラインパラメーターになります。それらを簡単にループできます。

var
  i: integer;
begin
  for i := 1 to ParamCount do
    Memo1.Lines.Add(ParamStr(i));
end;

したがって、それぞれについて、アプリ内で(たとえば、メインフォームのOnCreate内から)個別のフォームを開くことができます。または、通常のスタートアップコードの前に、プロジェクト(.dpr)ファイルから呼び出されるルーチンでこれをコーディングして、追加で起動することもできます。それぞれのアプリのインスタンス(これを実行しているインスタンス用に1つ保存します)。

たとえば、上記のループでは、ShellExecuteまたはCreateProcessを使用して、ParamStr(i)をそのインスタンスの単一パラメーターとして渡す自分のインスタンスを開始できます。

于 2013-03-12T18:33:19.873 に答える