我编了一程序,批量生成自解压的安装文件,用shell启动winrar后无法控制时序!!
是用WaitForInputIdle控制吗?? 
已知进程名(如winrar),如何获得进程句柄?? 如何等待指定进程结束后,再运行下面程序??

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
        hwd,hProcess : THandle;
        PID,Code : DWORD;
    begin
        hwd :=FindWindow('WinRarWindow',0);
        if hwd>0 then
          hwd := GetWindowThreadProcessId(hwd,@PID);    hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);    if hProcess>0 then
        begin
           waitforsingleobject(hProcess,INFINITE);
           GetExitCodeProcess(hProcess,Code);
        end;
        if Code=0 then
           ShowMessage('WinRAR结束了');
    end;
      

  2.   

    再转贴一个:执行外部程序并等待结束Function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;
    var
     StartupInfo:TStartupInfo;
     ProcessInfo:TProcessInformation;
    begin
     FillChar(StartupInfo,SizeOf(StartupInfo),#0);
     StartupInfo.cb:=SizeOf(StartupInfo);
     StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
     StartupInfo.wShowWindow:=visiable;
     if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then
       result:=0
     else
     begin
       waitforsingleobject(processinfo.hProcess,INFINITE);
       GetExitCodeProcess(ProcessInfo.hProcess,Result);
     end;
    end;
      

  3.   

    Function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;
    var
     StartupInfo:TStartupInfo;
     ProcessInfo:TProcessInformation;
    begin
     FillChar(StartupInfo,SizeOf(StartupInfo),#0);
     StartupInfo.cb:=SizeOf(StartupInfo);
     StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
     StartupInfo.wShowWindow:=visiable;
     if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then
       result:=0
     else
     begin
       waitforsingleobject(processinfo.hProcess,INFINITE);
       GetExitCodeProcess(ProcessInfo.hProcess,Result);
     end;
    end;
    感觉这个象以前我贴的:)