`
seara
  • 浏览: 649205 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

判断ShellExecute函数是否执行完一个程序的方法

阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

ShellExecute是windows的API函数,功能是执行可执行文件(exe)或任何关联文件(doc、txt、xls等)。但ShellExecute是异步执行的,也就是说,不管执行的程序是否成功运行,运行的时间是长是短,ShellExecute函数都会立即返回。这样虽然可以很好地完成执行程序的工作,但却会给后续的工作带来麻烦。
例如,当调用bcp命令向sql server导入数据后,在DBGrid中显示这些导入的数据。如果使用ShellExecute来直接执行bcp命令,很可能会在数据未完全导入时显示DBGrid。这样就会造成数据显示不完整或根本显示不出来数据。
要解决这个问题的方法就是使ShellExecute变成同步直接的,解决方法很多,例如,可以判断弹出的控制台窗口是否已关闭来确定bcp是否执行完。但这样做还会有一些问题,例如,如果执行根本没有弹出窗口的程序,那这种方法就不起作用了。而本书给出了另一种比较通用的方法。基本原理是利用了批处理文件的特性。虽然ShellExecute是异步执行的,但批处理是同步执行的,也就是在.bat、.cmd、.sh(linux/unix)中的命令是一个接一个顺序执行的。因此,我们可以采用在批处理文件中调用bcp命令的方法来实现同步调用。也就是说,可以在调用bcp之前,先中当前目录中建立一个文件或空目录,然后调用bcp,最后再删除这个文件或目录。这样可以通过判断文件或目录是否存在来确定bcp是否执行完成。为了确保在调用ShellExecute之前文件一定存在,可以在调用ShellExecute之前在程序中建立一个文件,在批处理中删除这个文件。下面是一个批处理文件的例子。

批处理文件名:bcp.cmd
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->set path = <bcp.exe的本地路径>/bcp.exe
bcp
%1in%2%3%4其他命令行参数
deltemp.txt

假设我们使用delphi来通过ShellExecute函数来运行bcp命令,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->FileCreate("temp.txt");
ShellExecute(,
"bcp.cmd",,);
whiletruedo
begin
iftemp.txt不存在then
begin
//bcp已成功执行
break;
end;
end;
//后续的处理代码



新浪微博手机客户端(Android/Ophone版)发布

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    在C语言源程序中调用API函数ShellExecute

    在C语言编程中,有时候我们需要实现的功能不仅仅是简单的数据处理或是算法逻辑,还需要与其他应用进行交互,比如打开一个文件、启动一个程序等。为了实现这些功能,我们可以利用Windows提供的API函数——`...

    C#ShellExecute示例源代码

    在C#编程中,`ShellExecute`方法是一个非常实用的功能,它允许开发者通过Windows壳层接口执行各种操作,如打开文件、运行程序、打印文档等。`ShellExecute`方法并不是C#内置的一部分,而是通过P/Invoke技术调用...

    C++程序启动外部程序的方法总结.pdf

    在C++编程中,有时我们需要在程序中启动另一个外部程序,这可以通过调用特定的系统API函数来实现。本文主要介绍了两种常用的方法:WinExec和ShellExecute,它们都是Windows API中的函数,用于在当前程序中启动新的...

    API之网络函数---整理网络函数及功能

    GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用 GetTempPath 获取为临时文件指定的路径 GetVolumeInformation 获取与一个磁盘卷有关的信息 GetWindowsDirectory 获取Windows目录的完整...

    一个完整的installshield安装程序实例(艾泽拉斯之海洋女神出品)

    ### 一个完整的Installshield安装程序实例 #### 前言 Installshield作为一款业界领先的安装程序制作工具,凭借其强大的功能赢得了广泛的认可。然而,它的复杂性和多样性使得初学者难以快速掌握并应用到实际项目中...

    VC++常用函数

    在程序启动时尝试创建一个互斥量,如果创建失败则表明已经有另一个实例正在运行。可以通过以下步骤实现: 1. 在`CWinApp::InitInstance`函数中创建互斥量。 2. 如果创建失败,则弹出提示框告知用户已有实例正在运行...

    delphi cmd 命令行 操作

    而cmd命令行,即命令提示符,是Windows操作系统中的一个基础工具,用于执行系统命令,进行文件操作、程序执行等任务。将Delphi与cmd命令行结合,我们可以实现许多自动化和程序控制的功能。本文将深入探讨如何在...

    易语言命令行文件定位

    4. 处理返回值:`ShellExecute`函数会返回一个整数值,根据返回值可以判断操作是否成功,以及出现错误时进行适当的错误处理。 在命令行文件定位中,文件路径的正确处理至关重要。路径可以是绝对路径,也可以是相对...

    获取应用程序的路径和图标

    在解压缩的文件列表中,“通过路径获取应用程序的图标”可能是提供了一个示例代码或工具,用于演示如何根据给定的路径提取并显示应用程序的图标。这个工具或代码可能包括以下步骤: 1. 打开文件选择对话框,让用户...

    VB 磁盘 硬盘 光驱 控制 源码 全套磁盘控制函数的使用

    3. **判断驱动器属性**:利用`GetDriveType` API可以判断一个驱动器是硬盘、光驱、网络驱动器还是其他类型。这对于确定如何处理不同类型的驱动器非常有用。 4. **取磁盘信息**:`GetVolumeInformation` API可以获取...

    Delphi 7 注册/卸载ocx控件 判断控件是否注册

    // 这里需要一个辅助函数来从OCX文件名中提取CLSID,这部分可能需要额外的实现 ``` 4. **源代码**: 在提供的`regOCX`文件中,应该包含了一个完整的Delphi 7项目,实现了上述功能。这个项目可以作为参考,帮助...

    delphi下实现应用程序掉线关闭后自动重启

    - 创建一个新的`TThread`子类,覆盖`Execute`方法来执行检测程序状态的任务。在线程中,你可以定期检查主应用程序的进程ID,看它是否还在运行。 2. **进程管理**: - Delphi的`System.Process`单元提供了处理进程...

    VC 函数库+各种功能的实现

    - **知识点**: 调用CHM文件需要利用ShellExecute函数。 - **示例**: `ShellExecute(NULL, "open", "file.chm", NULL, NULL, SW_SHOWNORMAL);` #### 十、最高窗口的实现 - **知识点**: 实现最高窗口主要是调整窗口...

    API之进程和线程函数

    在计算机科学中,进程和线程是执行程序的基本单位,它们的管理和控制对于操作系统以及应用程序的性能至关重要。API(应用程序编程接口)提供了各种函数来创建、管理、同步和终止进程与线程。下面,我们将深入探讨与...

    易语言API方式打开网页

    这个函数是Windows系统提供的一个功能强大的接口,可以用来执行各种操作,包括打开文件、运行程序、打印文档等。在易语言中,我们可以通过以下步骤来调用`ShellExecute`函数打开网页: 1. 首先,需要导入API。在...

    开机启动检测U盘程序 并打开主程序

    标题中的“开机启动检测U盘程序并打开主程序”指的是创建一个系统服务或者脚本,该服务或脚本会在计算机启动时自动运行,其主要功能是检查是否存在已连接的U盘,并在检测到U盘插入时执行特定的程序。这个过程涉及到...

    监视一个进程,当它停止响应时结束任务然后重启,可以是多个目录下的相同的程序

    在Delphi中,我们可以通过创建一个系统命令字符串,然后调用`ShellExecute`函数来执行`taskkill`命令。例如,若要结束进程ID为1234的进程,命令行可能是这样的: ```delphi var CommandLine: string; begin ...

    定时关机的小程序

    在Delphi中,我们可以使用Windows单元中的ShellExecute函数,传入"shutdown"命令以及相应的参数,例如"/s"表示关机,"/t"用来设定延迟时间(以秒为单位)。 4. **用户交互界面**:Delphi7的VCL(Visual Component ...

    C2010编程通用技巧范例大全

    判断程序是否处于调试模式有助于开发时进行特殊处理。可以通过预处理器宏`_DEBUG`来实现。 #### 消息控制函数 当滚动条滚动时,通常会触发`WM_HSCROLL`或`WM_VSCROLL`消息。可以为这些消息编写消息处理函数。 ###...

    c# 執行外部文件

    在C#编程中,执行外部文件是常见的任务,这通常涉及到启动另一个应用程序、播放音频、打开文档等。本文主要探讨如何使用两种不同的方法在C#中实现这一功能:使用`System.Diagnostics.Process`类和调用Win32 API的`...

Global site tag (gtag.js) - Google Analytics