转自:http://blog.csdn.net/xieyunc/article/details/4140620

 

如何让Delphi调用外部程序并等待其运行结束

1.

uses
    Windows,
    SysUtils,
    Classes,
    ShellAPI;
function RunAndWait(FileName: string; Visibility: Integer): THandle;
var
    zAppName: array[0..512] of Char;
    zCurDir: array[0..255] of Char;
    WorkDir: string;
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
begin
    try
      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, nil, nil, false, Create_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
      begin
        result := 0;
        Exit;
      end
      else
      begin
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess, result);
      end;
    finally
    end;
end;

 

2.

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;

 

其中 参数   Visibility 取值如下:
行号 参数 含义
1 SW_HIDE                        隐藏这个窗体,并激活其他窗体。
2 SW_MAXIMIZE                最大化指定的窗体。
3 SW_MINIMIZE                 最小化指定的窗体,并按顺序激活最上层的窗体。
4 SW_RESTORE               激活并显示窗体。如果窗体为最小化或者最大化,窗体恢复到原始大
                                          小和置。应用程序当恢复一个最小化的窗体时将指定标记。
5 SW_SHOW                      以当前的大小和位置激活并显示窗体。
6 SW_SHOWDEFAULT 
7 SW_SHOWMAXIMIZED    激活并最大化显示窗体。
8 SW_SHOWMINIMIZED     激活并最小化现实窗体。
9 SW_SHOWMINNOACTIVE    最小化窗体,保持其激活状态。
10 SW_SHOWNA                     以当前状态显示窗体,保持其激活状态。
11 SW_SHOWNOACTIVATE   以当前的大小和位置显示窗体,并保持其激活状态。
12 SW_SHOWNORMAL 激活并显示一个窗体。如果窗体为最大化或者最小化,窗体恢复到原始的大小和位置。当窗体第一次显示的时候,应用程序记录标记。

Delphi 调用外部程序并等待其运行结束的更多相关文章

  1. Delphi - 调用外部程序并阻塞到外部程序中

    Delphi 调用外部程序并阻塞到外部程序中 背景说明: 前段时间开发一个数据转换的系统,业务逻辑中说明数据需要压缩成.tar.gz格式. 我在Windows系统下采用,先生成批处理文件,然后调用Wi ...

  2. delphi调用外部程序打开文件

    delphi调用外部程序打开文件 ShellExecute的各种用法 一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOper ...

  3. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

  4. Delphi调用外部程序函数:WinExec() 和ShellExecute详解

    1,WinExec():   WinExec主要运行EXE文件,不能运行其他类型的文件.不用引用特别单元.   原型:UINT WinExec(exePath,ShowCmd)   示例,我想要用记事 ...

  5. C#主线程等待子线程运行结束

    佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...

  6. JAVA中调用外部程序,并等待其退出(涉及Runtime和ProcessBuilder)

    这段时间要写一个java调用外部程序的功能,踩了几个坑,这里分享一下. 首先用的是RunTime,调用代码如下: Process pro = Runtime.getRuntime().exec(&qu ...

  7. C#使用Process类调用外部程序(转)

    在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程.一.启动进程实例 Process myProc ...

  8. start 调用外部程序

    批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令 例:start explore ...

  9. 笔记||Python3进阶之调用外部程序

    像wget可以下载文件 ffmpeg可以切割.合并.转换.录制视频 free命令可以查看linux内存使用信息 python提供了库来调用外部程序.命令?> 最常见的两种方法:       ①o ...

随机推荐

  1. vim编辑器配置

    原文链接:https://github.com/ma6174/vim http://my.oschina.net/swuly302/blog/156784?fromerr=itaFZFMb https ...

  2. Support Library(4)ecliplse导入支援包的方法

    准备工作 下载支援包到本地.在 <sdk>/android-sdks/extras/android/support/v7 下包含两个目录「 m2repository,support  」 ...

  3. HDU 4757 Tree(可持久化trie)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意:给出一棵树,节点有权值.每次询问x到y的路径上与z抑或的最大值. 思路:可持久化trie. ...

  4. C#分页类

    using System.Linq; using System.Collections.Generic; namespace CommonLibrary { public class PagedLis ...

  5. 为Gradle添加tomcat插件,调试WEB应用

    Gradle提供了不输于maven的依赖管理 提供了强大的test功能,输出优美的测试报告 并且提供war插件,使用内置的jetty调试WEB应用 因为博主偏偏钟情于tomcat,所以希望使用tomc ...

  6. laravel/laravel和laravel/framework有何区别?

    在安装laravel的时候,我们一般是download github上的laravel/laravel,随后执行composer install,在这个过程中,你会发现composer其中的一项工作是 ...

  7. Machine Learning for hackers读书笔记(二)数据分析

    #均值:总和/长度 mean() #中位数:将数列排序,若个数为奇数,取排好序数列中间的值.若个数为偶数,取排好序数列中间两个数的平均值 median() #R语言中没有众数函数 #分位数 quant ...

  8. 51nod1158 全是1的最大子矩阵

    跟最大子矩阵差不多O(n3)扫一下.有更优写法?挖坑! #include<cstdio> #include<cstring> #include<cctype> #i ...

  9. 【第八篇】mvc razor视图配置404 500页面

    记住是最外层的这个Web.config 在  <system.web> </system.web>节点里面配置 <customErrors defaultRedirect ...

  10. BZOJ 3624 免费道路

    第一反应:这不先0后1做并查集就行了吗? 然后WA了... 哦....啊?哦...233 如果按顺序做并查集,有些0的边可能很重要(只能由它作为0连起两个联通块),但并没有被选. 于是先按1做并查集, ...