怎样知道程序中调用的另一个可执行文件已经运行结束了?

解决方案 »

  1.   

    好了,给你个函数吧
    procedure WinExecEx(Cmd :string);
    var
      AppName :array[0..512]of Char;
      CurDir  :array[0..255]of Char;
      WorkDir :string;
      StartupInfo  :TStartupInfo;
      ProcessInfo  :TProcessInformation;
    begin
      StrPCopy(AppName, Cmd);
      GetDir(0,WorkDir);
      StrPCopy(CurDir, WorkDir);
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      with StartupInfo do
      begin
        cb :=SizeOf(StartupInfo);
        wShowWindow :=STARTF_USEPOSITION +STARTF_USESIZE;
        dwX :=0;
        dwY :=0;
        dwXSize :=0;
        dwXSize:=0;
        dwFlags :=STARTF_USESHOWWINDOW;
      end;  if CreateProcess(nil, AppName, nil ,nil,False,
                           Create_New_Console or Normal_Priority_Class,
                           nil,nil,StartupInfo, ProcessInfo) then
        WaitForSingleObject(ProcessInfo.hProcess, Infinite);end;
      

  2.   

    修改一下,要不然程序会“假死”的procedure WinExecEx(Cmd :string);
    var
      AppName :array[0..512]of Char;
      CurDir  :array[0..255]of Char;
      WorkDir :string;
      StartupInfo  :TStartupInfo;
      ProcessInfo  :TProcessInformation;
      ret:DWORD;
    begin
      StrPCopy(AppName, Cmd);
      GetDir(0,WorkDir);
      StrPCopy(CurDir, WorkDir);
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      with StartupInfo do
      begin
        cb :=SizeOf(StartupInfo);
        wShowWindow :=STARTF_USEPOSITION +STARTF_USESIZE;
        dwX :=0;
        dwY :=0;
        dwXSize :=0;
        dwXSize:=0;
        dwFlags :=STARTF_USESHOWWINDOW;
      end;  if CreateProcess(nil, AppName, nil ,nil,False,
                           Create_New_Console or Normal_Priority_Class,
                           nil,nil,StartupInfo, ProcessInfo) then
      Repeat
        Application.ProcessMessage();
      until WaitForSingleObject(ProessInfo.hProcess,0)<>WAIT_TIMEOUT;
    end;