100分!用CreateProcess调用exe的问题

ywk 2002-11-13 05:16:40
用CreateProcess执行Myapp.exe,Myapp.exe从开始执行到结束需要大约两分钟,怎么才能让程序等着Myapp.exe执行结束后再继续往下执行?

我用的代码如下,但是只会等到程序开始执行,而不是执行结束。请大侠们帮忙看看,多谢了!

function TForm1.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;
ExecResult: DWORD;
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
ShowWindow(Application.Handle, SW_HIDE);
Enabled := false;
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, ExecResult);
Result := ExecResult;
Enabled := true;
ShowWindow(Application.Handle, SW_SHOWNORMAL);
BringToFront;
Application.BringToFront;
SetFocus;
end;
end;
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywk 2002-12-02
  • 打赏
  • 举报
回复
按照xggkk(kk) 的办法,问题已经解决了,给分!
wangchinaking 2002-11-20
  • 打赏
  • 举报
回复
CreateProcess太麻烦了,不如用WinExec快些,就像上面有一位说的。
smilelhh 2002-11-20
  • 打赏
  • 举报
回复
to ly_liuyang(Liu Yang) 大侠:
那个Visibility: integer参数是做什么用的?
如果想让那个执行文件运行时不可见,应该怎么做?谢谢
xggkk 2002-11-19
  • 打赏
  • 举报
回复
虽然这个办法比较笨,但可以试一试。
xggkk 2002-11-19
  • 打赏
  • 举报
回复
可能是那个exe的问题,注意观察运行时的标题,用Findwindow判断它的运行情况。
ywk 2002-11-14
  • 打赏
  • 举报
回复
没有什么不同呀,按照上面的代码也不行,会不会是那个exe的问题呀,那是msde的安装程序,会有什么问题呢?一旦执行就返回结果?应该不会吧?快急死了!
case_sheng 2002-11-14
  • 打赏
  • 举报
回复
WinExec(..., SW_SHOW); 这个是可以的.
ywk 2002-11-14
  • 打赏
  • 举报
回复
有没有人知道呀?
ly_liuyang 2002-11-13
  • 打赏
  • 举报
回复
等着Myapp.exe执行结束?
function TExecForm.Exec(FileName: string; Visibility: integer): integer;
var
zappname:array [0..512] of char;
zcurdir:array [0..255] of char;
workdir:string;
startupinfo:tstartupinfo;
processinfo:tprocessinformation;
exitcode:cardinal;
begin
strpcopy(zappname,filename);
getdir(0,workdir);
strpcopy(zcurdir,workdir);
fillchar(startupinfo,sizeof(startupinfo),#0);
startupinfo.cb:=sizeof(startupinfo);
startupinfo.wShowWindow:=visibility;
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;

procedure TExecForm.ExecuteClick(Sender: TObject);
var h:thandle;
begin
exec(exename.Text,0);
showmessage('Ruturn');
end;
Wnyu 2002-11-13
  • 打赏
  • 举报
回复

"我用的代码如下,但是只会等到程序开始执行,而不是执行结束"
没事呀,程序在运行关闭后返回!
findcsdn 2002-11-13
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1037/1037239.xml?temp=.8138239

1,184

社区成员

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

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