function WinExecAndWait32(FileName: string; Visibility: Integer;
ProcessMsg: Boolean): Integer;
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
if ProcessMsg then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
until (Result <> STILL_ACTIVE) or Application.Terminated;
end
else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
end;
end;
end;
其中 参数[can shu] Visibility 取值如下:
行号 参数[can shu] 含义
0 SW_HIDE 隐藏这个窗体[chuang ti],并激活[ji huo]其他窗体[chuang ti]。
2 SW_MAXIMIZE 最大化指定的窗体[chuang ti]。
3 SW_MINIMIZE 最小化指定的窗体[chuang ti],并按顺序激活[ji huo]最上层的窗体[chuang ti]。
4 SW_RESTORE 激活[ji huo]并显示[xian shi]窗体[chuang ti]。如果窗体[chuang ti]为最小化或者最大化,窗体[chuang ti]恢复到原始大
小和置。应用[ying yong]程序[ying yong cheng xu]当恢复一个最小化的窗体[chuang ti]时将指定标记[biao ji]。
5 SW_SHOW 以当前的大小和位置[wei zhi]激活[ji huo]并显示[xian shi]窗体[chuang ti]。
6 SW_SHOWDEFAULT
7 SW_SHOWMAXIMIZED 激活[ji huo]并最大化显示[xian shi]窗体[chuang ti]。
8 SW_SHOWMINIMIZED 激活[ji huo]并最小化现实窗体[chuang ti]。
9 SW_SHOWMINNOACTIVE 最小化窗体[chuang ti],保持其激活[ji huo]状态[zhuang tai]。
10 SW_SHOWNA 以当前状态[zhuang tai]显示[xian shi]窗体[chuang ti],保持其激活[ji huo]状态[zhuang tai]。
11 SW_SHOWNOACTIVATE 以当前的大小和位置[wei zhi]显示[xian shi]窗体[chuang ti],并保持其激活[ji huo]状态[zhuang tai]。
12 SW_SHOWNORMAL 激活[ji huo]并显示[xian shi]一个窗体[chuang ti]。如果窗体[chuang ti]为最大化或者最小化,窗体[chuang ti]恢复到原始的大小和位置[wei zhi]。当窗体[chuang ti]第一次显示[xian shi]的时候,应用[ying yong]程序[ying yong cheng xu]记录标记[biao ji]。
引用[yin yong]2
如果在你的软件[ruan jian]中留下了你的网页[wang ye]地址[di zhi][ye di zhi]和邮件[you jian]地址[di zhi],你肯定希望[xi wang]人们点击它就会启动[qi dong]浏览[liu lan]器[liu lan qi]或者电子邮件[you jian][dian zi you jian]软件[ruan jian]。这其实就是如何启动[qi dong]外部软件[ruan jian]的问题[wen ti],很简单,不是吗?不过,如果我问你,如何启动[qi dong]外部程序并等待[deng dai]它结束,你还能告诉我吗?
其实,这是一个“古老”的话题,在WIN95时代就被讨论过了。不过,既然这么多人不知道,我感觉还是有必要再讨论一下。
一、为什么要启动[qi dong]外部程序
也许,你想让你的程序完成全部的功能。不过,无论从物力还是人力上,你都应养成资源[zi yuan]共享[zi yuan gong xiang]的习惯。更好的考虑是,充分利用已有的程序,而让你的程序专注于某一方面的功能。比如说,浏览[liu lan]器[liu lan qi]负责打开网页[wang ye],让人们浏览[liu lan],当遇到下载[xia zai]的任务[ren wu]时,可以交给更专业的下载[xia zai]软件[ruan jian][xia zai ruan jian]去做。你也可能在你的程序里留下了你的主页[zhu ye]和邮箱地址[di zhi],你希望[xi wang]有人点击它们时就分别启动[qi dong]浏览[liu lan]器[liu lan qi]和电子邮件[you jian][dian zi you jian]。在某些情况[qing kuang]下,你需要外部程序处理后,再进行下一步的工作,这时就会遇到启动[qi dong]外部程序并等待[deng dai]它结束的问题[wen ti]。
二、预备知识[zhi shi]
启动[qi dong]外部程序我们可以使用函数[han shu]Winexec、ShellExecute和ShellExecuteEx。我推荐大家使用函数[han shu]ShellExecute,因为它既灵活,又简单。看看下面的例子,用法就清楚了:
*: 启动[qi dong]一个程序
ShellExecute(Handle,'open',PChar('c: estapp.exe'),
nil,nil,SW_SHOW);
* 启动[qi dong]记事本 (因为记事本在系统[xi tong]路径[lu jing]下,所以不必写完整的路径[lu jing]名[lu jing ming]了):
ShellExecute(Handle, 'open', PChar('notepad'),
nil, nil, SW_SHOW);
* 启动[qi dong]记事本并加载一个纯文本[wen ben]文件[wen jian]:
ShellExecute(Handle, 'open', PChar('notepad'),