转自: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调用外部程序打开文件 ShellExecute的各种用法 一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOper ...

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

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

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

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

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

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

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

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

  6. PowerShell中调用外部程序和进程操作命令例子

    学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是 ...

  7. Delphi 调用C# DLL(包含委托)

    例子 C# Dll: using System; using System.Collections.Generic; using System.Text; using System.Diagnosti ...

  8. 【转】Delphi调用webservice总结

    原文:http://www.cnblogs.com/zhangzhifeng/archive/2013/08/15/3259084.html Delphi调用C#写的webservice 用delph ...

  9. QProcess调用外部程序方式的差异

    众所周知QProcess类的作用是启动一个外部的程序并与之交互它有三种方式调用外部程序: 1. execute 2. start 3. startDetached 从调用上看: execute是阻塞调 ...

随机推荐

  1. Spark的StandAlone模式原理和安装、Spark-on-YARN的理解

    Spark是一个内存迭代式运算框架,通过RDD来描述数据从哪里来,数据用那个算子计算,计算完的数据保存到哪里,RDD之间的依赖关系.他只是一个运算框架,和storm一样只做运算,不做存储. Spark ...

  2. html5手机端的点击弹出侧边滑动菜单代码

    效果预览:http://hovertree.com/texiao/html5/19/ 本效果适用于移动设备,可以使用手机等浏览效果. 源码下载:http://hovertree.com/h/bjaf/ ...

  3. 关于JS的编码转换问题

    在进行JS开发过程中,尤其是在开发报表时,报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号或乱码等等一系列不能正常显示的情况. 这是由于浏览器和报 ...

  4. easyUi datagrid 返回时间格式化操作

    1.格式化返回的时间 { field : 'endTime', title : '轮播图片循环的结束时间', width : 50, align : 'center' //格式化时间操作 format ...

  5. 针对WebService服务,客户端调用时报序列化的最大项数maxItemsInObjectGraph超过65536问题

    今天在使用webservice服务时候,报异常"The InnerException message was 'Maximum number of items that can be ser ...

  6. [界面开发新秀]AYUI开发360领航版系列教程-AyWindow接入[1/40]

    开发包DLL下载地址:请加入 466717219群,自己下载(已经发布ayui3.7,在群里,为了不让你作为收藏工具,也只有入群才能下载,喜欢你就进.不喜欢你还是不要来了) AYUI初衷:简单化商业软 ...

  7. 初学嵌入式STM32基础下选哪款开发板适合学习

    iTOP-4412开发板 目前为止,在用户网盘上已经积累了多达100G以上资料, 这些资料都是和4412相关的,并不是随便拼凑起来的!同时我们也完全开放原厂资料. 鉴于用户对于海量资料无从下手的问题, ...

  8. Word文档增加快捷键

  9. 用代码将Excel数据导入Sql Server

    这里直接用小例子说明. 1.打开VS2010—>文件—>新建—>网站,选择ASP.NET空网站并设置存放路径以创建空网站.(我这里路径设置为D:\excelEduceToSql) 2 ...

  10. 怎样加入� android private libraries 中的包的源码

    先上图: 这里以加入� afinal_0.5.1_bin.jar 为例. 第一步:加入�jar包到libs里面,系统自己主动把jar载入到android private libraries中: 第二步 ...