在VB中调用DOS命令,如何得知DOS命令是否已经执行完毕

时间:2022-09-02 20:20:22

在VB中调用DOS命令,如何得知DOS命令是否已经执行完毕
_____________________________________________

Set wshl = CreateObject("wscript.shell")
wshl.Run "ping 9zp.com", 1, True   'true代表等待完成,1代表显示运行窗口
MsgBox "完成"
******************************************

[名称]           如何建立控制台窗口

[数据来源]       未知

[保存时间]       2002-06-18

[内容简介]       空

[源代码内容]

如何建立控制台窗口
以及让用户在其中输入字符同计算机进行交互对话。
    首先在选VB菜单中的 Project | Module 项向工程文件中加入一个模块,然后在
这个Module中加入以下代码:

Option Explicit

Private Declare Function AllocConsole Lib "kernel32" () As Long

Private Declare Function FreeConsole Lib "kernel32" () As Long

Private Declare Function GetStdHandle Lib "kernel32" _
(ByVal nStdHandle As Long) As Long

Private Declare Function ReadConsole Lib "kernel32" Alias _
"ReadConsoleA" (ByVal hConsoleInput As Long, _
ByVal lpBuffer As String, ByVal nNumberOfCharsToRead As Long, _
lpNumberOfCharsRead As Long, lpReserved As Any) As Long

Private Declare Function SetConsoleMode Lib "kernel32" (ByVal _
hConsoleOutput As Long, dwMode As Long) As Long

Private Declare Function SetConsoleTextAttribute Lib _
"kernel32" (ByVal hConsoleOutput As Long, ByVal _
wAttributes As Long) As Long

Private Declare Function SetConsoleTitle Lib "kernel32" Alias _
"SetConsoleTitleA" (ByVal lpConsoleTitle As String) As Long

Private Declare Function WriteConsole Lib "kernel32" Alias _
"WriteConsoleA" (ByVal hConsoleOutput As Long, _
ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, _
lpNumberOfCharsWritten As Long, lpReserved As Any) As Long

Private Const STD_INPUT_HANDLE = -10&
Private Const STD_OUTPUT_HANDLE = -11&
Private Const STD_ERROR_HANDLE = -12&

Private Const FOREGROUND_BLUE = &H1
Private Const FOREGROUND_GREEN = &H2
Private Const FOREGROUND_RED = &H4
Private Const FOREGROUND_INTENSITY = &H8
Private Const BACKGROUND_BLUE = &H10
Private Const BACKGROUND_GREEN = &H20
Private Const BACKGROUND_RED = &H40
Private Const BACKGROUND_INTENSITY = &H80

'For SetConsoleMode (input)
Private Const ENABLE_LINE_INPUT = &H2
Private Const ENABLE_ECHO_INPUT = &H4
Private Const ENABLE_MOUSE_INPUT = &H10
Private Const ENABLE_PROCESSED_INPUT = &H1
Private Const ENABLE_WINDOW_INPUT = &H8
'For SetConsoleMode (output)
Private Const ENABLE_PROCESSED_OUTPUT = &H1
Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2

'''''G L O B A L S'''''''''''''''''''''''''''''''''''
Private hConsoleIn As Long ' The console's input handle
Private hConsoleOut As Long ' The console's output handle
Private hConsoleErr As Long ' The console's error handle

'''''M A I N'''''''''''''''''''''''''''''''''''''''''
Private Sub Main()
    Dim szUserInput As String

    AllocConsole    '建立一个控制台窗口
    SetConsoleTitle "VB Console Example" '设置窗口标题

    '获得控制窗口的句柄
    hConsoleIn = GetStdHandle(STD_INPUT_HANDLE)
    hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)
    hConsoleErr = GetStdHandle(STD_ERROR_HANDLE)

    SetConsoleTextAttribute hConsoleOut, _
    FOREGROUND_RED Or FOREGROUND_GREEN _
    Or FOREGROUND_BLUE Or FOREGROUND_INTENSITY _
    Or BACKGROUND_BLUE

    ConsolePrint "VB Console Example" & vbCrLf
   
    SetConsoleTextAttribute hConsoleOut, _
    FOREGROUND_RED Or FOREGROUND_GREEN _
    Or FOREGROUND_BLUE
   
    ConsolePrint "Please Enter Your Name Here--> "

    '获得用户名
    szUserInput = ConsoleRead()
    If Not szUserInput = vbNullString Then
        ConsolePrint "Hello, " & szUserInput & "!" & vbCrLf
    Else
        ConsolePrint "Hello,But who are you?" & vbCrLf
    End If

    ConsolePrint "Press Enter To Close The Console"
    Call ConsoleRead

    FreeConsole ' Destroy the console
End Sub


Private Sub ConsolePrint(szOut As String)
    WriteConsole hConsoleOut, szOut, Len(szOut), vbNull, vbNull
End Sub

Private Function ConsoleRead() As String
    Dim sUserInput As String * 256
   
    Call ReadConsole(hConsoleIn, sUserInput, Len(sUserInput), vbNull, vbNull)
    'Trim off the NULL charactors and the CRLF.
    ConsoleRead = Left$(sUserInput, InStr(sUserInput, Chr$(0)) - 3)
End Function
    选VB菜单中的 Project | Project1 Properties项,将Startup Object改变为Sub Main,然后
运行程序,程序就会弹出一个控制台窗口,用户可以根据控制台窗口中的提示信息与程序进行交互
对话。

http://community.csdn.net/Expert/topic/4377/4377306.xml?temp=.4533197

'应该是Shell的命令程序没执行完,就执行显示文件到TEXTBox的操作了,使用WaitForSingleObject来等待Shell执行完后再执行下面操作
'先申明如下API
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
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 Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFFFFFF


'调用如下
Dim pId As Long, pHnd As Long
pId = Shell(要执行的应用程序)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
If pHnd <> 0 Then
   Call WaitForSingleObject(pHnd, INFINITE)
   Call CloseHandle(pHnd)
   '执行你读取文件到TextBox的操作
   ..................
else
   msgbox "调用失败"
End If