`

Shell 调用程序后等待该程序结束后返回继续

    博客分类:
  • vb
 
阅读更多

方法1:

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function
CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function
ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (lpInfo As Any) As Long

Private
Type SHELLEXECUTEINFO
cbSize
As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
' Optional members
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon_OR_Monitor As Long
hProcess As Long
End
Type

Private Sub Form_Load()
Dim si As SHELLEXECUTEINFO
si.cbSize = Len(si)
si.lpVerb =
"open"
si.lpFile = "notepad.exe"
si.lpParameters = ""
si.lpDirectory = ""
si.nShow = 5 'SW_SHOW
si.fMask = &H40 'SEE_MASK_NOCLOSEPROCESS
ShellExecuteEx si
If si.hProcess <> 0 Then
WaitForSingleObject si.hProcess, &HFFFFFFFF ' 无限等待, 直到程式结束
CloseHandle si.hProcess
MsgBox
"程序运行完毕!"
End If
End Sub


方法2:

Public Declare Function OpenProcess Lib "kernel32" Alias "OpenProcess" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function
WaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function
CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
Dim
lngPId As Long
Dim
lngPHandle As Long
lngPId = Shell("Notepad", vbNormalFocus)
lngPHandle = OpenProcess(SYNCHRONIZE,
0, lngpId)
If lngPHandle <> 0 Then
Call
WaitForSingleObject(lngPHandle, INFINITE) ' 无限等待, 直到程式结束
Call CloseHandle(lngPHandle)
End If


方法3:

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function
GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function
CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Const
PROCESS_QUERY_INFORMATION = &H400

Const STILL_ALIVE = &H103

Private Sub Command1_Click()
Dim pid As Long
pid = Shell("c:\a.bat", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
0, pid)
Do
Call
GetExitCodeProcess(hProcess, ExitCode)
DoEvents
Loop While ExitCode = STILL_ALIVE
Call CloseHandle(hProcess)
MsgBox (
"运行结束")
End Sub

 

分享到:
评论

相关推荐

    VB Shell调用后等待程序运行结束

    然而,当你使用`Shell`函数启动一个程序后,VB并不会自动等待这个程序运行结束,而是立即返回并继续执行后续代码。这可能会导致一些问题,比如你可能希望在外部程序完成其任务后再执行其他操作。为了实现这个需求,...

    调用Shell 执行exe 等待返回例子(VB)

    本篇文章将深入探讨如何在VB中调用Shell执行exe,并等待其返回结果,帮助开发者更好地理解和应用这一技术。 首先,我们需要了解VB中的Shell函数。Shell函数是VB提供的一个内置函数,用于启动一个新的进程或执行一个...

    VBA示例之 求人不如自已动手 Shell调用的程序执行完成后再执行其它程序

    本示例将探讨如何在VBA中使用Shell函数来调用外部程序,并确保在该程序执行完毕后继续执行其他VBA代码。 标题"VBA示例之 求人不如自已动手 Shell调用的程序执行完成后再执行其它程序"揭示了我们主要要学习的是通过...

    Excel-VBA宏编程实例源代码-运行外部程序并等待其结束(Run方法).zip

    然而,需要注意的是,`Shell`函数并不能保证程序执行结束后才会继续执行VBA代码,尤其是当外部程序执行时间较短时。为了确保等待,可以使用`WScript.Shell`对象的`Run`方法,结合`WaitOnReturn`参数设置为`True`,如...

    linux作业:编写shell程序

    - **无需等待**:程序需要支持后台执行命令,即不等待子进程结束就返回Shell提示符,允许用户继续输入新的命令。 ##### 3. 多行命令处理 - **分析命令行中的分号**:当用户在一个命令行中输入多个命令时,命令之间...

    VB SHELL等待

    然而,如果我们想要等待被调用程序执行完成后再继续执行脚本的下一行,我们就需要使用`WScript.Shell`对象的另一个方法——`WaitForSingleObject`。这个方法可以使得VBScript暂停执行,直到指定的进程完成。以下是...

    java调用shell

    - **等待脚本完成**:使用`process.waitFor()`确保Shell脚本完全执行完毕再继续后续操作。此方法会阻塞当前线程,直到子进程结束。 - **环境变量**:如果需要为Shell脚本提供特定的环境变量,可以使用`...

    Excel-VBA宏编程实例源代码-运行外部程序并等待其结束(Exce方法).zip

    这个压缩包“Excel-VBA宏编程实例源代码-运行外部程序并等待其结束(Exce方法).zip”提供了一个具体的例子,展示了如何使用VBA来运行一个外部程序,并确保该程序运行完毕后再继续执行后续的VBA代码。 首先,我们要...

    四川大学操作系统课程设计高分报告-第二次实验-shell编程基础.doc

    wait调用用于父进程等待子进程的结束,并获取子进程的退出状态。exit调用则标志着进程的终止,它可以传递一个退出状态给父进程,当父进程调用wait时会获取这个状态。 **5. pipe通信** pipe是一种单向的进程间通信...

    判断一个32位程序是否结束...

    如果失败,返回零,并且可以通过调用`GetLastError`函数来获得错误代码。 3. **`WaitForSingleObject`** 和 **`WaitForMultipleObjects`**: - **定义**:这两个函数用于等待一个或多个对象状态的改变。 - **参数...

    unix、Linux命令解释程序 shell

    - 后台执行:实现后台命令,需要对子进程进行特殊处理,例如,不等待其完成就返回,可以通过在`fork()`后立即返回父进程来实现。 实现这样一个命令解释程序可以帮助你深入理解Unix/Linux系统的工作原理,包括进程...

    Visual Basic 6.0取得Shell的输出结果

    5. **等待进程结束**:调用`WaitForSingleObject`函数等待进程执行完毕。这一步很重要,因为我们需要确保所有输出都被读取。 6. **关闭句柄**:最后,使用`CloseHandle`关闭创建的进程和管道句柄,释放资源。 代码...

    java调用shell脚本完美封装

    调用`Process.waitFor()`方法可以等待子进程结束并返回退出码,这可以帮助我们判断脚本是否成功执行: ```java int exitCode = process.waitFor(); System.out.println("Exit code: " + exitCode); ``` 4. **...

    一个简单的shell

    6. **循环继续**: 完成一个命令的执行后,Shell返回到读取用户输入的步骤,继续等待下一个命令。 **学习重点** 在实现这个简单的Shell时,你需要深入理解以下几个方面: - **Unix/Linux系统调用**: 如`fork()`, `...

    精彩编程与编程技巧-Shell & Wait 的程序怎么写?...

    通过结合使用 Shell 和 Wait,程序员可以有效地启动外部应用程序,并等待这些应用程序执行完毕。本文将详细介绍如何在 VB(Visual Basic)环境中实现这一功能,包括必要的 API 调用、代码示例以及运行机制。 #### ...

    vb设计程序例程

    实现这一功能,我们可以使用`AppActivate`和`WaitFor`函数,或者直接在Shell调用中加上`vbNormalFocus`或`vbMinimizedFocus`,这将使VB程序等待该进程结束。 以下是一个简单的示例,展示了如何使用Shell函数并等待...

    Linux下简单shell实现

    - 如果是父进程,则通过调用`waitpid()`等待子进程结束,并打印子进程的退出状态。 #### 3.2 `makestring()` 函数 `makestring()`函数的功能是去掉字符串末尾的换行符,并为该字符串分配内存。具体来说,它先找到...

Global site tag (gtag.js) - Google Analytics