WinExecAndWait32

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'),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值