您的位置:首页 > 编程语言 > Delphi

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

2009-08-15 10:39 513 查看
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;  

 
 
第二种方式:

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息