用shellexecute执行一外部程序,如何等外部程序启动成功(而非关闭)再回来执行下一条语句?(5分)

  • 主题发起人 主题发起人 lkdbdlkq
  • 开始时间 开始时间
L

lkdbdlkq

Unregistered / Unconfirmed
GUEST, unregistred user!
不要用waitforsingleobject 这个东东是要等外部程序关闭才回来的,我只是想让外部程序启动成功后再返回我的程序继续执行指令,因为外部程序可能启动时间有点长,shellexecute以后,外部程序还在启动,可是shellexecute后面的findwindows捕获外部程序窗口的指令就已经执行并且得不到正确的值,如何确保外部程序已经启动完成再执行shellexecute后面的指令呢?当然加sleep延迟一些时间可以解决问题 ,不过有没有更好的办法呢?
 
如果你知道这个出现的窗体,那么你可以循环啊,直到捕获这个窗体才终止撒,然后就执行下面的指令了.
 
//调用窗体,以模式窗体的形式显示啦,你试一下面的代码啦!!<br>procedure TformMain.Button1Click(Sender:TObject); <br>var <br> F:TForm; <br> B:TButton; <br>begin <br> F:=TForm.Create(Self); <br> try <br> &nbsp;B:=TButton.Create(F); B.Parent:=F; <br> &nbsp;B.OnClick:=CreateProcessForm; B.ModalResult:=mrCancel; <br> &nbsp;F.Left:=Screen.Width; F.Top:=Screen.Height; //将窗口隐藏起来 <br> &nbsp;F.Width:=0; F.Height:=0; <br> &nbsp;PostMessage(B.Handle, BM_Click, 0, 0); <br> &nbsp;F.ShowModal; //调用模式窗口,由此窗口来创建进程,并等待进程结束。 <br> finally <br> &nbsp;F.Free; <br> end; <br>end; <br><br>procedure TformMain.CreateProcessForm(Sender:TObject); <br>var <br> StartUpInfo:TStartupInfo; <br> ProcessInfo:TProcessInformation; <br> seProcess, seThread: TSecurityAttributes; <br> S:String; <br> exCode:DWORD; <br>begin <br> S:=ExtractFilePath(Application.ExeName)+'prjBoardLinker.exe'; <br> if not FileExists(S) then raise Exception.Create('找不到执行文件'+S); <br> FillChar(StartUpInfo, SizeOf(StartUpInfo), 0); <br> FillChar(seProcess, SizeOf(seProcess),0); <br> FillChar(seThread, SizeOf(seThread),0); <br> StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW ; <br> seProcess.nLength := sizeof(seProcess); <br> seProcess.lpSecurityDescriptor := nil; <br> &nbsp;seProcess.bInheritHandle := true; <br> seThread.nLength := sizeof(seThread); <br> seThread.lpSecurityDescriptor := nil; <br> seThread.bInheritHandle := true; <br> if not CreateProcess(nil, PChar(S), @seProcess, @seThread, False, 0 , nil, nil, StartUpInfo, ProcessInfo) then <br> &nbsp;raise Exception.Create('创建进程'+S+'失败'); <br> GetExitCodeProcess(ProcessInfo.hProcess,exCode); <br><br> while(exCode=STILL_ACTIVE) do <br> begin <br> &nbsp; Sleep(10); <br> &nbsp; Application.ProcessMessages; <br> &nbsp; GetExitCodeProcess(ProcessInfo.hProcess,exCode); <br> end; <br>end;
 
接受答案了.
 
后退
顶部