微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

delphi执行外部程序等待程序运行成功,而不是程序

时间:2017-02-03 04:01  浏览:努力统计中...
我想用delphi执行一个外部程序,等外部程序完全运行(这个程序不能关闭),并取得这个外部程序中的Edit句柄 在主程序运行的时候需要外部程序辅助,我现在用CreateProcess运行程序以后,因为程
我想用delphi执行一个外部程序,等外部程序完全运行(这个程序不能关闭),并取得这个外部程序中的Edit句柄
在主程序运行的时候需要外部程序辅助,我现在用CreateProcess运行程序以后,因为程序太快edit句柄有时取不到,如何等待,这个外部程序完全打开了,再往下读句柄

我的软件上没有输入,运行成功了再点击一个按钮,全是软件控制的
function WinExecAndWait32(FileName: string; Visibility: integer): Dword;
  {执行一个外部程序并等待其结束}
var
  zCurDir: array[0..255] of char;
其实可以变化一下,等几秒然后再读,不需要等到运行成功,一般5秒钟足够程序运行完毕了
  WorkDir: string;
  StartupInfo: TStartupInfo;
因为计算机配置不同导致启动exe速度不同,可以用动态分配等待时间来解决。保证在外部exe一启动马上获取到,如果不启动一直等下去(也可以设置一个超时限止)。
  ProcessInfo: TProcessInformation;
begin
  chmForm.btSaveas.Tag := 1;
  chmForm.btView.Tag := 1;
  TRY
  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)
  zAppName: array[0..512] of char;
  then Result := 1 { pointer to PROCESS_INF }

  else
  begin
  while WaitforSingleObject(ProcessInfo.hProcess, 10) = WAIT_TIMEOUT
  do Application.ProcessMessages;
  GetExitCodeProcess(ProcessInfo.hProcess, Result);
  FINALLY
  chmForm.btSaveas.Tag := 0;
WinexecAndWait32(‘arj.exe >c:\temp\arj.txt‘,SW_SHOW);
  chmForm.btView.Tag := 0;
  END;
end;


iseekcode你的代码能保证我运行的外部程序在运行吗,不能退出我在以后还要用他,你的代理我看怎么像要等外部程序关闭以后才会返回啊

不会有输入的,运行成功以后就自动运行别的了,你这等于死循环

WaitForInputIdle


注意这句:
while WaitforSingleObject(ProcessInfo.hProcess, 10) = WAIT_TIMEOUT 

你可以修改10这个值。


WaitforSingleObject参数:
Parameters
hHandle [in] 
A handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section. 

  end;
If this handle is closed while the wait is still pending, the function's behavior is undefined.

The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.

dwMilliseconds [in] 
The time-out interval, in milliseconds. If a nonzero value is specified, the function waits until the object is signaled or the interval elapses. If dwMilliseconds is zero, the function does not enter a wait state if the object is not signaled; it always returns immediately. If dwMilliseconds is INFINITE, the function will return only when the object is signaled.

Return Value
If the function succeeds, the return value indicates the event that caused the function to return. It can be one of the following values.


发现用这个WinExecAndWait32,打开的程序运行会出错,直接运行就没问题,不知道怎么回事

标记



我一直在用,没有问题。检查一下代码。


忘了说明:
 chmForm.btSaveas.Tag := 0; 
 chmForm.btView.Tag := 0;

这两句是我加的。你可以去掉。

CreateProcess
PostMessage(AppHandle,WM_CLOSE,NULL,NULL);
WaitForSingleObject

调用如:

建议楼主加分。


学习了
function ExeProc(fun:Pointer;para:array of const):Cardinal;const//
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------