主程序使用下面的代码执行一个外部程序,主程序等待外部程序执行完后再运行。如何实现?
我用下面的代码
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
不行。看不到外部程序的运行。主程序好像死了。
我用下面的代码
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
不行。看不到外部程序的运行。主程序好像死了。
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;
我调的外部程序是用installshield做的安装程序。
调用ie是没有问题的。
h:=findwindow();
if h<>0 then sleep (不知道多少妙!)
的方法正确 你在加载的时候必须对你的进行处理
才能保证
不行的话 可以试试 WaitForSingleObjectEx 这个函数
While ( h>0 ) Do // 如果h>0 程序正在运行
begin
h := FindWindow(nil,'程序标题栏的文本') ;
end ;
问题出在waitforsingleobject上。
waitforsingleobject如何使用呢?
你的方法我试了,不行。和用createprocess一样
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;
你的方法我也试了。结果是一样的。
to lion_lh(xmanx):
我试了一下。不行。结果和其他方法一样。现在的问题是。用createprocess创建exeploer,可以运行。我能够看到。运行良好。
创建安装程序,运行起来就像死机一样。只有把主程序关了。创建的安装程序才能运行。
如何解决?
你再用 SendMessage () 把ShowMessage()的窗口隐藏,不就得了注意,如果你的程序是 多线程 ( 或是有控件Timer.Enable:=True) 就不行了