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

2025-03-04 11:52:56
推荐回答(1个)
回答1:

调用下面的WinExecAndWait32 函数即可。

function  WinExecAndWait32(FileName:String;  Visibility  :  integer):  DWORD;  
var  
        zAppName:array[0..512]  of  char;
        zCurDir:array[0..255]  of  char;
        WorkDir:String;
        StartupInfo:TStartupInfo;
        ProcessInfo:TProcessInformation;
begin
        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,  {  pointer  to  command  line  string  }
        nil,  {  pointer  to  process  security  attributes  }
        nil,  {  pointer  to  thread  security  attributes  }
        false,  {  handle  inheritance  flag  }
        CREATE_NEW_CONSOLE  or  {  creation  flags  }
        NORMAL_PRIORITY_CLASS,
        nil,  {  pointer  to  new  environment  block  }
        nil,  {  pointer  to  current  directory  name  }
        StartupInfo,  {  pointer  to  STARTUPINFO  }
        ProcessInfo  {  pointer  to  PROCESS_INF  }
        )
        then  Result  :=  $FFFFFFFF  else  begin
                WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
                GetExitCodeProcess(ProcessInfo.hProcess,Result);
        end;
end;



procedure TForm1.N9Click(Sender: TObject);
var i:integer;
begin
     WinExecAndWait32('PAS2 >tempc2.txt',0);
     EXECUTEFILE('notepad.EXE','tempc2.txt','',sw_showmaximized);
end;