2013-03-12 40 views

回答

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.但是,作为一个数学性质,这个版本的对称性吸引了我。

+0

你不想为其中一个文件使用当前实例的任何原因? – 2013-03-12 18:29:50

+0

@Andreas我喜欢对称 – 2013-03-12 18:39:04

+0

够公平的。我也想到了这一点。 – 2013-03-12 18:40:28

2

只要将droppend文件作为参数传递,就可以为传递的每个参数运行Application的新实例。
在下面显示的示例中,第一个参数将由通过Drog启动的应用程序处理。&在资源管理器中,将为任何其他参数运行应用程序的新实例。

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. 

最简单的代码在窗体2可以通过

procedure TForm2.FormCreate(Sender: TObject); 
begin 
    Caption := ParamStr(1); 
    // whatever should be done with the dropped file 
end; 
+1

这段代码意味着什么?写一些*句子*解释答案。 – 2013-03-12 19:24:30

1

每个文件例如掉在你的应用程序图标或快捷方式将是一个命令行参数。你可以通过它们循环容易:

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

因此,对于每一个,你可以在你的应用程序中(例如,从你的主窗体的OnCreate中)在从项目调用程序打开一个单独的形式,或者你也可以这个代码(.dpr)文件,然后启动您的应用程序的其他实例(为您正在执行的实例保存一个实例)。

E.g.在上面的循环中,您可以使用ShellExecute或CreateProcess启动您自己的实例,将ParamStr(i)作为单个参数传递给该实例。

相关问题