怎样判断由ShellExecute开启的程序 什么时候结束运行??
我看有人说可以这样
a = ShellExecute(0, "open", "jpg2dcm.exe", cmd, "", 0)
c = WaitForSingleObject(a, -1)
但没有效果啊,a是个40几,c返回的是-1,或者有没有更好的办法????
[解决办法]
'模块
Option Explicit
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
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Global Const NORMAL_PRIORITY_CLASS = &H20&
Global Const INFINITE = -1&
Declare Function CloseHandle Lib "kernel32" (hObject As Long) As Boolean
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Declare Function CreateProcessA Lib "kernel32" ( _
ByVal lpApplicationName As Long, _
ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal _
lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal _
dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal _
lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Public Sub ShellAndWait(cmdline$)
Dim NameOfProc As PROCESS_INFORMATION
Dim NameStart As STARTUPINFO
Dim X As Long
NameStart.cb = Len(NameStart)
X = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, _
0&, 0&, NameStart, NameOfProc)
X = WaitForSingleObject(NameOfProc.hProcess, INFINITE)
X = CloseHandle(NameOfProc.hProcess)
End Sub
'窗体
Private Sub Command1_Click()
Dim AppToLaunch As String
AppToLaunch = "c:\win95\notepad.exe"
ShellAndWait AppToLaunch
End Sub
[解决办法]
- VB code
Option ExplicitPrivate Const NORMAL_PRIORITY_CLASS = &H20&Private Const STARTF_USESTDHANDLES = &H100&Private Const STARTF_USESHOWWINDOW = &H1Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As LongEnd TypePrivate Type STARTUPINFO cb As Long lpReserved As Long lpDesktop As Long lpTitle As Long 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 LongEnd TypePrivate Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As LongEnd TypePrivate Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As LongPrivate Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As LongPrivate Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Function retunCmdResult(strCommand As String) As String Dim Proc As PROCESS_INFORMATION '进程信息 Dim Start As STARTUPINFO '启动信息 Dim SecAttr As SECURITY_ATTRIBUTES '安全属性 Dim hReadPipe As Long '读取管道句柄 Dim hWritePipe As Long '写入管道句柄 Dim lngBytesRead As Long '读出数据的字节数 Dim strBuffer As String * 256 '读取管道的字符串buffer Dim Command As String 'DOS命令 Dim ret As Long 'API函数返回值 Dim lpOutputs As String '读出的最终结果 '设置安全属性 With SecAttr .nLength = LenB(SecAttr) .bInheritHandle = True .lpSecurityDescriptor = 0 End With '创建管道 ret = CreatePipe(hReadPipe, hWritePipe, SecAttr, 0) If ret = 0 Then MsgBox "无法创建管道", vbExclamation, "错误" Exit Function End If '设置进程启动前的信息 With Start .cb = LenB(Start) .dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES .hStdOutput = hWritePipe '设置输出管道 .hStdError = hWritePipe '设置错误管道 End With '启动进程 Command = strCommand 'DOS进程以ipconfig.exe为例 ret = CreateProcess(vbNullString, Command, SecAttr, SecAttr, True, NORMAL_PRIORITY_CLASS, ByVal 0, vbNullString, Start, Proc) If ret = 0 Then MsgBox "无法启动新进程", vbExclamation, "错误" ret = CloseHandle(hWritePipe) ret = CloseHandle(hReadPipe) Exit Function End If '因为无需写入数据,所以先关闭写入管道。而且这里必须关闭此管道,否则将无法读取数据 ret = CloseHandle(hWritePipe) '从输出管道读取数据,每次最多读取256字节 Do ret = ReadFile(hReadPipe, strBuffer, 256, lngBytesRead, ByVal 0) lpOutputs = lpOutputs & Left(strBuffer, lngBytesRead) DoEvents Loop While (ret <> 0) '当ret=0时说明ReadFile执行失败,已经没有数据可读了 '读取操作完成,关闭各句柄 ret = CloseHandle(Proc.hProcess) ret = CloseHandle(Proc.hThread) ret = CloseHandle(hReadPipe) retunCmdResult = lpOutputsEnd FunctionPrivate Sub Command1_Click() Dim strCommand As String strCommand = "tasklist" '在此处带入你的命令 Text1.Text = retunCmdResult(strCommand)End Sub
