0

我知道如何以这种方式打开一个文件,以及如何获取在我的应用程序的 EXE 或快捷方式上拖放的文件数量。

但是,如何运行多个应用程序实例,每个文件一个?

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

至于作为参数传递的 droppend 文件,可以为传递的每个参数运行一个新的应用程序实例。
在下面显示的示例中,第一个参数将由在资源管理器中通过 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) 文件调用的例程中对此进行编码并启动其他每个应用程序的实例(为您正在执行此操作的实例保存一个)。

例如,在上面的循环中,您可以使用 ShellExecute 或 CreateProcess 来启动您自己的实例,并将 ParamStr(i) 作为该实例的单个参数。

于 2013-03-12T18:33:19.873 回答