Delphi技巧集六 ,等待执行完一个外部程序再执行另一个程序

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses ShellAPI; //注意

{$R *.dfm}

function ExecAppWait(AppName, Params: string): Boolean;

var

ShellExInfo: TShellExecuteInfo;

begin

FillChar(ShellExInfo, SizeOf(ShellExInfo), 0);

with ShellExInfo do begin

cbSize := SizeOf(ShellExInfo);

fMask := see_Mask_NoCloseProcess;

Wnd := Application.Handle;

lpFile := PChar(AppName);

lpParameters := PChar(Params);

nShow := sw_ShowNormal;

end;

Result := ShellExecuteEx(@ShellExInfo);

if Result then

while WaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do

begin

Application.ProcessMessages;

if Application.Terminated then Break;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

const { 连续运行下面这四个EXE文件 }

EXEFILES : array[1..4] of string =

('calc.exe', 'mspaint.exe', 'Notepad.exe', 'wordpad.exe');

var

Success: Boolean;

InstanceID: THandle;

I : integer;

begin

for I := Low(EXEFILES) to High(EXEFILES) do

begin

Application.Minimize;

Success := False;

try

Success := ExecAppWait(EXEFILES[I], '')

finally

Application.Restore;

if not Success then

ShowMessage(Format('Application %d failed: %s', [ I, EXEFILES[I] ]));

end;

end;

end;

end.