我在vb程序中调用shell函数,执行.bat批处理文件
现在知道利用API 可以判断一个进程是否结束,如下
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFFFFFF
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但是调用了WaitForSingleObject后,vb中的其他程序都不能运行了,我可以同时判断进程是否结束,同时也能在vb中做其他操作呢?
我不知道这个是不是和多进程有关,请高手指点一下吧

解决方案 »

  1.   

    WaitForSingleObject本来就是是阻塞的
    只有当其返回时才会接着执行下面语句
    用多线程可以解决DoEvent
      

  2.   

    用DoEvent可以怎么做呢?
    我不懂线程,可不可以讲具体一点呢?
    谢谢了哦
      

  3.   

    你为什么不用Shell来调用外部应用程序呢,
    然后在定时器中用“GetExitCodeProcess”api来检测调用的外部应用程序(就是cmd.exe)是否结束了运行。
    示例如下
    Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess _
         As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function TerminateProcess Lib "Kernel32" _
        (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function GetExitCodeProcess Lib "Kernel32" _
        (ByVal hProcess As Long, lpExitcode As Long) As Long
    Private Declare Function CloseHandle Lib "Kernel32" (ByVal hobject As Long) As LongPrivate RetProcess As Double
    Private Const PROCESS_QUERY_INFORMATION = &H400
    Private Const STATUS_PENDING = &H103&
    Private hProcess As Long, Exitcode As LongRetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus)
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, RetProcess)'用定时器检测进程是否退出
    Private Sub TimerProcess_Timer()
        TimerProcess.Enabled = False
        Call GetExitCodeProcess(hProcess, Exitcode)
        If Exitcode <> STATUS_PENDING Then
            '进程已关闭
            Call CloseHandle(hProcess)
            TimerProcess.Enabled = False
        Else
            '进程未关闭
            TimerProcess.Enabled = True
        End If
    End Sub
      

  4.   

    RetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus) 是不是就是调用bat文件?
    "cmd.exe d:\user.bat"这个我不怎么懂?
      

  5.   

    cmd.exe win2k和xp下的命令行控制台,在cmd.exe下运行user.bat
      

  6.   

    我在WaitForSingleObject加了一句:DoEvents
    然后运行的时候发现还是老样子,我一把cmd.exe的窗口移动,vb窗口就会出现一个白框框,和程序没响应一样。
      

  7.   

    WaitForSingleObject是阻塞该语句中信号以外所有当前程序消息队列的消息处理,
    vc中用WaitForMultipleObjects来同时等待消息和让当前程序处理本程序消息队列的消息。
    不过vb因是以单线程为主,不知能否用WaitForSingleObject。
    我觉得最好还是在定时器中进行查询。
      

  8.   

    RetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus)
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, RetProcess)
    这一段是放在General里面吗?