''模块代码
Const SYNCHRONIZE = &H100000
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredaccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Function StillRun(ByVal PrgID) As Boolean
Dim Prg As Long
Prg = OpenProcess(SYNCHRONIZE, False, PrgID)
If Prg <> 0 Then
StillRun = True
Else
StillRun = False
End If
CloseHandle Prg
End Function
''====================================
'调用代码:
cFile = App.Path & "\mapdat.exe"
pId = Shell(cFile, vbHide)
While StillRun(pId)
LbInf.Caption = "正在计算..."
DoEvents
Wend
LbInf.Caption = "计算完毕!"
当窗体出现“计算完毕!”后我执行如下代码无反应:
Private Sub CmdExit_Click()
Unload Me
End Sub
外部程序mapdat.exe是另外同志用c#编写的,占用内存资源都作了释放,
请高手分析还有那些可能导致我的程序被挂起,谢谢先!
Const SYNCHRONIZE = &H100000
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredaccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Function StillRun(ByVal PrgID) As Boolean
Dim Prg As Long
Prg = OpenProcess(SYNCHRONIZE, False, PrgID)
If Prg <> 0 Then
StillRun = True
Else
StillRun = False
End If
CloseHandle Prg
End Function
''====================================
'调用代码:
cFile = App.Path & "\mapdat.exe"
pId = Shell(cFile, vbHide)
While StillRun(pId)
LbInf.Caption = "正在计算..."
DoEvents
Wend
LbInf.Caption = "计算完毕!"
当窗体出现“计算完毕!”后我执行如下代码无反应:
Private Sub CmdExit_Click()
Unload Me
End Sub
外部程序mapdat.exe是另外同志用c#编写的,占用内存资源都作了释放,
请高手分析还有那些可能导致我的程序被挂起,谢谢先!
解决方案 »
- 求助:为什么总是提示"无效的关键字"
- 简单问题:使用FSO清空一个文件夹中文件?(没有子文件夹)--在线等!!
- 为什么DDActiveReport报表的工具栏是灰白的
- 重装VB后,MSDN需要重装吗?
- 在线结帖.诸位大侠,下面这个代码该怎么改啊
- 请问一下怎么样 解除窗体锁定---是窗体不是控件。。谢谢 !!~~
- 问一个有点难度的问题,如何在WIN98/ME 用VB显示XP图标?
- 花了一天时间终于写好了,大家帮我Debug吧!顺便散分!
- 50分请教:如何把任意类型的文件添加到access数据库ole类型字段?
- 鼠标拖动对象的问题
- 请教数据库二进制图片的写入和读取....
- VB如何编程实现同时结束两个或者多个进程(最好是系统进程)
Option Explicit
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 OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000Private Sub Form_Load()
Dim lngTask&, ret&, pHandle&
LbInf.Caption="正在计算... "
On Error GoTo Err_shell
lngTask = Shell(App.Path & "\mapdat.exe", vbHide)
pHandle = OpenProcess(SYNCHRONIZE, False, lngTask)
ret = WaitForSingleObject(pHandle, INFINITE)
ret = CloseHandle(pHandle)
LbInf.Caption="计算完毕!"
exit sub
Err_shell:
msgbox err.description
LbInf.Caption="出错!!"
err.clear
End Sub
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000
Private Sub Command1_Click()
'监视被调用的进程
Dim iTask As Long, ret As Long, pHandle As Long
Dim SHStr As String
SHStr = App.Path & "\mapdat.exe "
iTask = Shell(SHStr, vbHide)
pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
ret = WaitForSingleObject(pHandle, INFINITE)
ret = CloseHandle(pHandle)
End Sub最后,建议你用SHELL调用任何程序都应使用cmd.exe /C 来调用,因为 /C 参数让程序运行完后自动中断退出内存,如调用你的程序应为:
SHStr =CMD.EXE /C " & App.Path & "\mapdat.exe "
关于cmd.exe /C的用法你可以查一下帮助。