如何让Delphi调用外部程序并等待其运行信息(如结束)

函数一:

view plaincopy to clipboardprint?
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; 
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;

函数二:

view plaincopy to clipboardprint?
function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;      
var     
  zAppName: array[0..512] of char; //存放应用程序名      
  StartupInfo: TStartupInfo;      
  ProcessInfo: TProcessInformation;      
  exitCode: Dword;      
  aVisibility: integer;      
begin     
  StrPCopy(zAppName, FileName);      
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);      
  //给StartupInfo结构体赋值      
  StartupInfo.cb := Sizeof(StartupInfo);      
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;      
  if Visibility then     
    aVisibility := 1     
  else     
    aVisibility := 0;      
     
  StartupInfo.wShowWindow := aVisibility;      
  //调用CreateProcess 创建进程,执行指定的可执行文件      
  if not CreateProcess(nil, zAppName, nil, nil, false     
    , CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS      
    , nil, nil, StartupInfo, ProcessInfo) then     
    Result := -1     
  else     
  begin     
    //等待可执行文件退出      
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);      
    //得到进程终止状态码      
    GetExitCodeProcess(ProcessInfo.hProcess, exitCode);      
    result := Exitcode;      
  end;      
end; 
function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;   
var  
  zAppName: array[0..512] of char; //存放应用程序名   
  StartupInfo: TStartupInfo;   
  ProcessInfo: TProcessInformation;   
  exitCode: Dword;   
  aVisibility: integer;   
begin  
  StrPCopy(zAppName, FileName);   
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);   
  //给StartupInfo结构体赋值   
  StartupInfo.cb := Sizeof(StartupInfo);   
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;   
  if Visibility then  
    aVisibility := 1  
  else  
    aVisibility := 0;   
  
  StartupInfo.wShowWindow := aVisibility;   
  //调用CreateProcess 创建进程,执行指定的可执行文件   
  if not CreateProcess(nil, zAppName, nil, nil, false  
    , CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS   
    , nil, nil, StartupInfo, ProcessInfo) then  
    Result := -1  
  else  
  begin  
    //等待可执行文件退出   
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);   
    //得到进程终止状态码   
    GetExitCodeProcess(ProcessInfo.hProcess, exitCode);   
    result := Exitcode;   
  end;   
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 激活并显示一个窗体。如果窗体为最大化或者最小化,窗体恢复到原始的大小和位置。当窗体第一次显示的时候,应用程序记录标记。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xieyunc/archive/2009/04/30/4140620.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章