Delphi 调用外部程序并等待其运行结束

函数一:

uses

Windows,

SysUtils,

Classes,

ShellAPI;

function RunAndWait(FileName: string; Visibility: Integer): THandle;

var

zAppName: array[0..512] of Char;

zCurDir: array[0..255] of Char;

WorkDir: string;

StartupInfo: TStartupInfo;

ProcessInfo: TProcessInformation;

begin

try

StrPCopy(zAppName, FileName);

GetDir(0, WorkDir);

StrPCopy(zCurDir, WorkDir);

FillChar(StartupInfo, SizeOf(StartupInfo), #0);

StartupInfo.cb := SizeOf(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;

StartupInfo.wShowWindow := Visibility;

if not CreateProcess(nil, zAppName, nil, nil, false, Create_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then

begin

result := 0;

Exit;

end

else

begin

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

GetExitCodeProcess(ProcessInfo.hProcess, result);

end;

finally

end;

end;

函数二:

  1. function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;
  2. var
  3. zAppName: array[0..512] of char; //存放应用程序名
  4. StartupInfo: TStartupInfo;
  5. ProcessInfo: TProcessInformation;
  6. exitCode: Dword;
  7. aVisibility: integer;
  8. begin
  9. StrPCopy(zAppName, FileName);
  10. FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  11. //给StartupInfo结构体赋值
  12. StartupInfo.cb := Sizeof(StartupInfo);
  13. StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  14. if Visibility then
  15. aVisibility := 1
  16. else
  17. aVisibility := 0;
  18. StartupInfo.wShowWindow := aVisibility;
  19. //调用CreateProcess 创建进程,执行指定的可执行文件
  20. if not CreateProcess(nil, zAppName, nil, nil, false
  21. , CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
  22. , nil, nil, StartupInfo, ProcessInfo) then
  23. Result := -1
  24. else
  25. begin
  26. //等待可执行文件退出
  27. WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
  28. //得到进程终止状态码
  29. GetExitCodeProcess(ProcessInfo.hProcess, exitCode);
  30. result := Exitcode;
  31. end;
  32. end;

其中 参数 Visibility 取值如下:

行号 参数 含义

1 SW_HIDE 隐藏这个窗体,并激活其他窗体。

2 SW_MAXIMIZE 最大化指定的窗体。

3 SW_MINIMIZE 最小化指定的窗体,并按顺序激活最上层的窗体。

4 SW_RESTORE 激活并显示窗体。如果窗体为最小化或者最大化,窗体恢复到原始大

小和置。应用程序当恢复一个最小化的窗体时将指定标记。

5 SW_SHOW 以当前的大小和位置激活并显示窗体。

6 SW_SHOWDEFAULT

7 SW_SHOWMAXIMIZED 激活并最大化显示窗体。

8 SW_SHOWMINIMIZED 激活并最小化现实窗体。

9 SW_SHOWMINNOACTIVE 最小化窗体,保持其激活状态。

10 SW_SHOWNA 以当前状态显示窗体,保持其激活状态。

11 SW_SHOWNOACTIVATE 以当前的大小和位置显示窗体,并保持其激活状态。

12 SW_SHOWNORMAL 激活并显示一个窗体。如果窗体为最大化或者最小化,窗体恢复到原始的大小和位置。当窗体第一次显示的时候,应用程序记录标记。