主程序使用下面的代码执行一个外部程序,主程序等待外部程序执行完后再运行。如何实现?
我用下面的代码
if createprocess(nil,cmdline,nil, nil, true,0 , nil, nil, startupinfo, processinfo) then
  begin
    //h:=OpenProcess(PROCESS_ALL_ACCESS,false,processinfo.dwProcessId);
    WaitForSingleObject(processinfo.hProcess, INFINITE);
    GetExitCodeProcess(processinfo.hprocess,result);
end
不行。看不到外部程序的运行。主程序好像死了。

解决方案 »

  1.   

    function WinExecAndWait32(FileName:String; Visibility: Integer): Integer;
    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) then Result := -1 { pointer to PROCESS_INF }  else begin
        WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        //GetExitCodeProcess(ProcessInfo.hProcess,Result);
        Result := 0;
      end;
    end;
      

  2.   

    当主程序,关闭后。就可以看到外部程序运行了。
    我调的外部程序是用installshield做的安装程序。
    调用ie是没有问题的。
      

  3.   

    用循环搞定
    h:=findwindow();
    if h<>0 then sleep (不知道多少妙!)
      

  4.   

    循环不行用GOTO语句,我用过,可以,必须外部程序关了才能继续,不过没有人赞成!呵呵!
      

  5.   

    li_zhifu(东北人) 
    的方法正确 你在加载的时候必须对你的进行处理
    才能保证
    不行的话 可以试试 WaitForSingleObjectEx 这个函数
      

  6.   

    我用WaitForSingleObjectEx试了,不行
      

  7.   

    h := FindWindow(nil,  '程序标题栏的文本' ) ;
    While ( h>0 ) Do   // 如果h>0 程序正在运行
    begin
           h := FindWindow(nil,'程序标题栏的文本') ;
    end ;
      

  8.   

    SHELLEXECUTEINFO ShExecInfo = {0};ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd = NULL;ShExecInfo.lpVerb = NULL;ShExecInfo.lpFile = "c:\MyProgram.exe"; ShExecInfo.lpParameters = ""; ShExecInfo.lpDirectory = NULL;ShExecInfo.nShow = SW_SHOW;ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
      

  9.   

    用createprocess创建process是成功的。
    问题出在waitforsingleobject上。
    waitforsingleobject如何使用呢?
      

  10.   

    to bbs791109(小别):
    你的方法我试了,不行。和用createprocess一样
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var cmdStr:pchar;
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    begin
    cmdstr:=pchar('c:\winnt\Notepad.exe');
    {建立进程并等待其结束}fillchar(StartupInfo,sizeof(StartupInfo),0);
    CreateProcess(nil,cmdstr,nil,nil,false,0,nil,nil,StartupInfo,ProcessInfo);
    With ProcessInfo do begin
    CloseHandle(hThread);
    WaitForSingleObject(hProcess, INFINITE);
    CloseHandle(hProcess);
    end;
    end;
      

  12.   

    to l0f(凌风):
    你的方法我也试了。结果是一样的。
    to lion_lh(xmanx):
     我试了一下。不行。结果和其他方法一样。现在的问题是。用createprocess创建exeploer,可以运行。我能够看到。运行良好。
    创建安装程序,运行起来就像死机一样。只有把主程序关了。创建的安装程序才能运行。
    如何解决?
      

  13.   

    ShowMessage() ; //程序就停下来了,
    你再用 SendMessage () 把ShowMessage()的窗口隐藏,不就得了注意,如果你的程序是 多线程 ( 或是有控件Timer.Enable:=True) 就不行了