2013-03-12 45 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)作爲單個參數傳遞給該實例。

相關問題