足球培训内容:VB - 让Shell具有Wait功能

来源:百度文库 编辑:中财网 时间:2024/04/28 00:49:35

在 VB 中,常以 Shell 指令来执行外部程序,其传回值是PID,然而它在 Create 外部 Process 后,立刻就会回到下一行代码,无法做到等待该 Process 结束时,才执行下一行代码,或者说,无法得知该 Process 是否已结束,因此我们需借助 API 函数来完成。

现举例说明 "WaitForShell" 在控制 Shell 指令中的作用:
****************************************************************************************************************
Option Explicit
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
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
Const PROCESS_QUERY_INFORMATION = &H400
Const STILL_ALIVE = &H103

'-------------------{WaitForShell}------------------
'让 Shell 所 Create 的 Process 具有 Wait 功能
'-----------------------------------------------------------
Sub WaitForShell(ByVal PID As Long)
    Dim hProcess As Long, ExitCode As Long
    Dim isDone As Boolean
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, PID)
    isDone = False
    Do
        Call GetExitCodeProcess(hProcess, ExitCode)
        DoEvents
    Loop While ExitCode = STILL_ALIVE
    Call CloseHandle(hProcess)
    isDone = True
End Sub

'调用示例:
Private Sub Command1_Click()
    Dim sPid As Long
    Dim ReadLine As String, Rtn As String
    '╱*调用 cmd 执行 vol 指令:用以显示磁盘卷标和序列号,并写入 d 盘目录下的 "Disk.txt" 文件*╱
    sPid = Shell("cmd /c vol d:>d:\Disk.txt", vbHide)
    '╱*若注释掉下面一句,会出现“文件未找到!”的错误,因为文件尚未创建好就去读必然出错。*╱
    Call WaitForShell(sPid)
    '╱*尝试读取 "d:\Disk.txt"里的内容*╱
    Open "d:\Disk.txt" For Input As #1
        Do While Not EOF(1)
            Line Input #1, ReadLine
            Rtn = Rtn & ReadLine
        Loop
    Close #1
    MsgBox Rtn
End Sub