当用Shell函数调用外部软件时,VB总会在Shell执行后,继续执行下面的程序代码,而我们无法确定外部软件什么时候调用结束。我们可以通过Windows API的OpenProcess和CloseHandle函数来实现对被调用软件的检测: 1) 在VB中新建一个标准EXE工程; 2) 在Form1中声明OpenProcess和 CloseHandle 这两个Windows 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 3) 然后编写下面的函数: Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID Dim hProgram As Long '被检测的程序进程句柄 hProgram = OpenProcess(0, False, ProgramID) If Not hProgram = 0 Then IsRunning = True Else IsRunning = False End If CloseHandle hProgram End Function 4) 在Form_Click()中加入代码: Sub Form_Click() Dim X Me.Caption = "开始运行" X = Shell("NotePad.EXE", 1) While IsRunning(X) DoEvents Wend Me.Caption = "结束运行" End Sub
to apple800(老五):谢谢你,这个我也试过了,但我想要的就像sqlserver 那个“服务管理器”那样,启动的时候不弹出东西,启动完也不弹出东西,to zhysecond(太阳伞): starsoulxp(星魂.NET)的做法和说法都没有错,我也尝试了,但当我执行bat文件时,它还是不能捕捉当前bat是否已经结束了bat文件里面是启动sqlserver服务,然后在程序启动的时候调用那个bat来启动sqlserver服务,当启动完成了,程序再连接到刚才启动的那个实例上以上只是我的一个想法,如果各位高手有更好的做法,请告知,谢谢
1) 在VB中新建一个标准EXE工程;
2) 在Form1中声明OpenProcess和 CloseHandle 这两个Windows 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
3) 然后编写下面的函数:
Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID
Dim hProgram As Long '被检测的程序进程句柄
hProgram = OpenProcess(0, False, ProgramID)
If Not hProgram = 0 Then
IsRunning = True
Else
IsRunning = False
End If
CloseHandle hProgram
End Function
4) 在Form_Click()中加入代码:
Sub Form_Click()
Dim X
Me.Caption = "开始运行"
X = Shell("NotePad.EXE", 1)
While IsRunning(X)
DoEvents
Wend
Me.Caption = "结束运行"
End Sub
scm.exe -action 1 -service mssqlserver
http://community.csdn.net/Expert/topic/3283/3283596.xml?temp=.9963953