delphi运行外部程序并等待外部程序运行完毕,并不是结束

chengran1984 2012-05-11 11:43:05
运行外部程序并等待外部程序结束才返回结果的函数在下面
function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;
var
zAppName: array[0..512] of char; //存放应用程序名
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
exitCode: Dword;
aVisibility: integer;
begin
StrPCopy(zAppName, FileName);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
//给StartupInfo结构体赋值
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
if Visibility then
aVisibility := 1
else
aVisibility := 0;

StartupInfo.wShowWindow := aVisibility;
//调用CreateProcess 创建进程,执行指定的可执行文件
if not CreateProcess(nil, zAppName, nil, nil, false
, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
, nil, nil, StartupInfo, ProcessInfo) then
Result := -1
else
begin
//等待可执行文件退出
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
//得到进程终止状态码
GetExitCodeProcess (ProcessInfo.hProcess, exitCode);
result := exitCode;
end;
end;

如何修改一下变成我需要的功能,很多人说修改为WaitForInputIdle
但是我真的一点都不懂啊
...全文
996 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
muyeyu 2013-12-29
  • 打赏
  • 举报
回复
菜鸟飘过,不明白外部程序不关闭的情况下,怎么会有ExitCode返回?
虎子8 2013-12-28
  • 打赏
  • 举报
回复
用一下进程通信 命名管道,都封装好了
推云童子 2013-12-28
  • 打赏
  • 举报
回复
WaitForInputIdle 好像不起作用,进程的主窗口还没创建就执行过了,导致取不到进程窗口句柄,无从操作
s11ss 2012-05-14
  • 打赏
  • 举报
回复
可以循环监测主窗口是否找到!

while FindWIndow(类名, 标题) = 0 do
begin
Application.ProcessMessages;
Sleep(100)
end
chengran1984 2012-05-13
  • 打赏
  • 举报
回复
哎,还是没解决,郁闷阿
chengran1984 2012-05-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20030218/13/1439470.html

看下这个帖子吧,我和这个发帖人遇到的是同样的问题。
JPEXE 2012-05-12
  • 打赏
  • 举报
回复
那得用进程间通讯,不然外面不可能知道你调用的程序什么时候把主窗体创建完。

[Quote=引用 2 楼 的回复:]

我上面贴出的函数是:

执行的这个外部程序必须关闭以后,才能继续向下执行

而我要的效果是,执行的这个外部程序完全打开以后(主窗体创建完毕)就开始继续向下执行,这个外部程序并不关闭。
[/Quote]
JPEXE 2012-05-12
  • 打赏
  • 举报
回复
云里雾里啊 LZ
chengran1984 2012-05-12
  • 打赏
  • 举报
回复
我上面贴出的函数是:

执行的这个外部程序必须关闭以后,才能继续向下执行

而我要的效果是,执行的这个外部程序完全打开以后(主窗体创建完毕)就开始继续向下执行,这个外部程序并不关闭。
haitao 2012-05-12
  • 打赏
  • 举报
回复
运行外部程序并等待外部程序运行完毕

运行外部程序并等待外部程序运行结束
有什么区别吗?
kaikai_kk 2012-05-12
  • 打赏
  • 举报
回复
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);

第2个参数可以是时间,单位是毫秒;
如果都是用具体的时间,没啥区别,都是在等待指定的时间,时间到就返回,不管被启动的程序是否启动成功

若是INFINITE,即永远等待下去,不受时间限制(取决于被启动程序执行的时间)
区别在于前者要等到程序完全执行结束才返回,即从create到close
而后者是,create完毕就返回,所以你的程序可以用WaitForInputIdle这个函数
haitao 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
我上面贴出的函数是:

执行的这个外部程序必须关闭以后,才能继续向下执行

而我要的效果是,执行的这个外部程序完全打开以后(主窗体创建完毕)就开始继续向下执行,这个外部程序并不关闭。
[/Quote]

那直接winexec(...)就可以了吧

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧