delphi 实现执行外部程序,并等待程序结束的函数


delphi 实现执行外部程序,并等待程序结束的函数

引用ShellAPI单元;

 1 type
 2 TExecState = (esNormal, esMinimized, esMaximized, esHidden);
 3 
 4 function ExecuteFileWait(Handle: HWND; const FileName, Params, StartDir: string; InitialState: TExecState): Integer;
 5 
 6 {
 7 Handle: 传入当前窗口或 Applicaton 的句柄
 8 FileName: 需要传入的文件名
 9 Params: 执行文件所带的参数
10 StartDir: 执行文件启动路径
11 InitialState: 窗口显示模式
12 }
13 
14 实现代码如下:
15 
16 { ExecuteFileWait }
17 
18 function ExecuteFileWait(Handle: HWND; const FileName, Params, StartDir: string; InitialState: TExecState): Integer;
19 const
20 ShowCommands: array[TExecState] of LongInt = (SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED, SW_HIDE);
21 var
22 Info: TShellExecuteInfo;
23 ExitCode: DWORD;
24 FActive: HWND;
25 begin
26 FillChar(Info, SizeOf(Info), 0);
27 Info.cbSize := SizeOf(TShellExecuteInfo);
28 with Info do
29 begin
30 fMask := SEE_MASK_NOCLOSEPROCESS;
31 Wnd := Application.MainForm.Handle;
32 lpFile := PChar(FileName);
33 lpParameters := PChar(Params);
34 lpDirectory := PChar(StartDir);
35 nShow := ShowCommands[InitialState];
36 end;
37 FActive := GetActiveWindow;
38 
39 if ShellExecuteEx(@Info) then
40 begin
41 EnableWindow(Handle, False);
42 repeat
43 Application.ProcessMessages;
44 GetExitCodeProcess(Info.hProcess, ExitCode);
45 until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
46 EnableWindow(Handle, True);
47 ShowWindow(Handle, SW_SHOW);
48 SetActiveWindow(FActive);
49 SetForegroundWindow(FActive);
50 Result := ExitCode;
51 end
52 else Result := -1;
53 end;
54 
55 
56 示范:
57 
58 begin
59 ExecuteFileWait(Application.Handle, 'C:\Windows\NotePad.EXE', 'C:\A.txt', '', esMaximized);
60 ShowMessage('OK! 程序已退出!');
61 end;