等待外部应用程序的执行结果

在日常程序设计中,有时候需要调用外部应用程序,并且要根据外部应用程序的执行情况来更新本应用程序的当前显示结果。调用外部应用程序的API函数有WinExec()、ShellExecute()、ShellExecuteEx()。但是,如何让应用程序使用ShellExecuteEx() 之类的函数调用外部应用程序后,等待外部应用程序运行结束,之后再执行后续语句呢?

    思路:创建一个线程,在此线程里用ShellExecuteEx() 调用外部程序,调用后阻塞本线程,等待外部程序运行结束。
uses
  ShellAPI; //后面要用到的ShellExecuteInfo结构包含在此单元中, 因此须事先声明之

Type
  TOpenFile = Class(TThread)
    Filename : string;  //完全文件名
    Constructor Create(fName : string);
    Procedure Execute;Override; //线程体
end;

Constructor TOpenFile.Create(fName : string);
begin
  inherited Create(true);
  Filename := fName;
  FreeOnTerminate := true; //自动释放
  Resume;              //恢复运行
end;

Procedure TOpenFile.Execute;
var ShellExInfo : ShellExecuteInfo;
begin
  FillChar(ShellExInfo,SizeOf(ShellExInfo),0);
  with ShellExInfo do    //填充外部命令执行信息
  begin
    cbSize := SizeOf(ShellExInfo);
    fMask := See_Mask_NoCloseProcess;
    Wnd := 0;
    lpFile := PChar(FileName);
    nShow := SW_ShowNormal;
  end;
  ShellExecuteEx(@ShellExInfo);
  WaitForSingleObject(ShellExInfo.hProcess,INFINITE);//阻塞等待进程结束
  Form1.Button2.Click;  //这里写入外部调用的进程执行结束后要做的事情
end;

调用方式:
procedure TForm1.Button1Click(Sender: TObject);
begin
//  if WinExec('c:\windows\regedit.exe',0) > 0 then //成功调用
//    if WinExec()函数执行完毕 then //并且调用返回时
//      Button2.Click;
//以上的功能由下句代替!
  TOpenFile.Create('c:\windows\regedit.exe');
end;
   此代码在大富翁论坛刘麻子的指导下实现。本人本着得之于大富翁,还之于大富的原则,整理并公布于此。

 

谢谢:dawnsoft
方法2:
procedure TForm1.Button1Click(Sender: TObject);
var
  cmdStr:pchar;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  cmdstr:=pchar('C:\Program Files\WinRAR\Winrar.exe a test.rar "C:\WINDOWS\system32\shell32.dll"');
  {建立进程并等待其结束}
  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;
  Application.MessageBox('执行完毕!', '提示');

end;

来源:http://www.delphibbs.com/keylife/iblog_show.asp?xid=24550

转载于:https://www.cnblogs.com/railgunman/archive/2010/08/25/1808567.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值