运行外部程序并等待外部程序结束才返回结果的函数在下面
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
但是我真的一点都不懂啊
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
但是我真的一点都不懂啊
那直接winexec(...)就可以了吧
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);第2个参数可以是时间,单位是毫秒;
如果都是用具体的时间,没啥区别,都是在等待指定的时间,时间到就返回,不管被启动的程序是否启动成功若是INFINITE,即永远等待下去,不受时间限制(取决于被启动程序执行的时间)
区别在于前者要等到程序完全执行结束才返回,即从create到close
而后者是,create完毕就返回,所以你的程序可以用WaitForInputIdle这个函数
begin
Application.ProcessMessages;
Sleep(100)
end