如何讓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

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