精彩编程与编程技巧-如何判定VB调用的一个EXE程序已经结束....
根据给定的信息,本文将详细解释如何在Visual Basic (VB) 中判断一个被调用的 EXE 文件是否已经结束执行。此技术对于那些需要在 VB 应用程序中调用外部程序并等待其完成的任务非常有用。 ### 如何判定VB调用的一个EXE程序已经结束 #### 基本原理 在 VB 中,可以使用 `CreateProcess` 函数来启动一个外部程序(EXE)。当启动外部程序后,通常我们需要等待这个程序执行完毕,才能继续执行 VB 中的后续操作。这可以通过使用 `WaitForSingleObject` 或 `WaitForInputIdle` 函数来实现。 #### 实现步骤 1. **定义常量**:首先需要定义一些常量来配置创建进程时的参数。 - `NORMAL_PRIORITY_CLASS`: 设置为普通优先级类。 - `INFINITE`: 表示无限等待时间。 - `WAIT_TIMEOUT`: 定义了等待超时的状态。 2. **定义数据类型**: - `PROCESS_INFORMATION`: 用于存储由 `CreateProcess` 函数返回的信息,如进程句柄、线程句柄等。 - `STARTUPINFO`: 包含了进程启动时的一些设置信息。 3. **声明 API 函数**: - `CloseHandle`: 关闭已打开的对象句柄。 - `WaitForSingleObject`: 等待单个对象变为指定状态。 - `CreateProcess`: 创建一个新的进程。 - `WaitForInputIdle`: 等待进程进入空闲状态。 4. **启动进程**: - 使用 `CreateProcess` 函数来启动指定的 EXE 文件。 - 传递必要的参数,包括要启动的 EXE 文件路径、启动信息结构体等。 - 检查 `CreateProcess` 的返回值以确保进程成功启动。 5. **等待进程结束**: - 可以选择使用 `WaitForSingleObject` 或 `WaitForInputIdle` 来等待进程结束。 - `WaitForSingleObject` 等待指定对象进入指定状态。 - `WaitForInputIdle` 等待进程进入空闲状态,即不再处理任何输入事件。 6. **清理资源**: - 在进程结束后,关闭之前打开的所有句柄,释放系统资源。 #### 示例代码详解 ```vb Option Explicit ' 常量定义 Private Const NORMAL_PRIORITY_CLASS As Long = &H20 Private Const INFINITE As Long = &HFFFFFFFF Private Const WAIT_TIMEOUT As Long = &H102 ' PROCESS_INFORMATION 结构体定义 Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type ' STARTUPINFO 结构体定义 Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type ' API 函数声明 Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _ (ByVal lpApplicationName As String, ByVal lpCommandLine As String, _ ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _ ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As Any, ByVal lpCurrentDirectory As String, _ ByVal lpStartupInfo As STARTUPINFO, ByVal lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long ' 处理按钮点击事件 Private Sub command1_Click() Dim res As Long Dim sinfo As STARTUPINFO Dim pinfo As PROCESS_INFORMATION ' 初始化 STARTUPINFO sinfo.cb = Len(sinfo) sinfo.lpReserved = vbNullString sinfo.lpDesktop = vbNullString sinfo.lpTitle = vbNullString sinfo.dwFlags = 0 ' 调用 CreateProcess res = CreateProcess(DemoFile, vbNullString, 0, 0, True, _ NORMAL_PRIORITY_CLASS, ByVal 0&, vbNullString, _ sinfo, pinfo) If res Then ' 等待进程结束 WaitForTermpinfo End If End Sub ' 等待进程终止 Private Sub WaitForTerm(ByVal pinfo As PROCESS_INFORMATION) Dim res As Long ' 等待进程进入空闲状态 Call WaitForInputIdle(pinfo.hProcess, INFINITE) ' 清理资源 Call CloseHandle(pinfo.hProcess) Call CloseHandle(pinfo.hThread) End Sub ``` #### 总结 通过上述步骤和代码,我们可以在 VB 中成功地调用一个外部 EXE 文件,并能够准确地判断该 EXE 文件何时执行完毕。这种方法在需要同步执行外部程序的场景下非常实用。此外,正确地管理句柄和清理资源对于保持应用程序的稳定性和性能至关重要。






























- 粉丝: 22
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 探究计算机网络管理及安全技术.docx
- 探究微课在中职计算机基础教学中的运用.docx
- 新网络技术标准带来的改变探讨.docx
- 金融行业网络安全等级保护实施指引-基本要求.pdf
- PLC课程设计说明书.doc
- 模具企业管理中采用项目管理方法和工具.doc
- 如何用spss进行二元和多元logistic回归分析.doc
- 大数据时代企业会计信息化风险防范对策探讨.docx
- 面向对象程序设计方案实验.doc
- 浅析计算机网络的工程管理在水利建设中的应用.docx
- 16.玩转大学ppt高档模板-ios毛玻璃扁平化时尚ppt模板图表图片.ppt
- 调度信息化系统在煤矿设备管理中的应用.docx
- Bomber网络技术有限公司商业.doc
- 松下PLC编程软件FPWINGR操作简介.ppt
- 2018年高考数学一轮复习-第十二章-推理与证明、算法、复数-12.3-算法与程序框图-文-新人教A版.ppt
- DB2业务规则的应用实践(2).doc


