''模块代码
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#编写的,占用内存资源都作了释放,
请高手分析还有那些可能导致我的程序被挂起,谢谢先!

解决方案 »

  1.   


    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
      

  2.   

    不过有一个重要前提:mapdat.exe必须在计算完毕后自动退出
      

  3.   

    你其实是想作一个SHELL的等待程序,即等待一个外部程序运行结束后再运行自已的程序,以下这段代码可解决你的问题。Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPrivate 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 = &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的用法你可以查一下帮助。