首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> VB.NET >> 正文

VB Shell调用后 等待程序运行结束

         另外,如果您的shell所Create的程式,有视窗且为立刻Focus者,可另外用以
        下的方式

   Dim pid As Long
        Dim hwnd5 As Long
        pid = Shell("c:\tools\spe3\pe2.exe", vbNormalFocus)
        hwnd5 = GetForegroundWindow()
        isDone = False
        Do While IsWindow(hwnd5)
        DoEvents
        Loop
        isDone = True

        而如何强迫shell所Create的process结束呢,那便是

        Dim aa As Long
        If hProcess <> 0 Then
        aa = TerminateProcess(hProcess, 3838)
        End If

  hProcess便是先前的例子中所取得的那个Process Handle, 3838所指的是传给GetExitCodeProcess()中的第二叁数,这是我们任意给的,但最好不要是0,因为0一般是代表正常结束,当然这样设也不会有错。当然不可设&H103,以这个例子来看,如果程式正处於以下的LOOP

         Do
        Call GetExitCodeProcess(hProcess, ExitCode)
        Debug.Print ExitCode
        DoEvents
        Loop While ExitCode = STILL_ALIVE
        Debug.print ExitCode

   而执行了 TerminateProcess(hProcess, 3838)那会看到ExitCode = 3838.然而,这个方式在win95没问题,在NT中,可能您要在OpenProcess()的第一个叁数要更改成 PROCESS_QUERY_INFORMATION Or PROCESS_TERMINATE 这样才能Work.不过良心的建议,非到最後关头,不要使用TerminateProcess(),因不正常的结束,往往许多程式结束前所要做的事都没有做,可能造成Resource的浪费,甚者,下次再执行某些程式时会有问题,例如:本人常使用MS-dos Shell Link 的方式执行一程式,透过Com port与大电脑的联结,如果Ms-dos Shell Link 不正常结束,下次再想Link时,会发现too Many Opens,这便是一例。
 
  另外,有人使用Shell来执行。bat档,即:pid = Shell("c:\aa.bat", vbNormalFocus)
 
  可是却遇上aa.bat结束了,但ms-dos的Window却仍活着,那可以用以下的方式来做pid = Shell("c:\command.com /c c:\aa.bat", vbNormalFocus)
 
  那是执行Command.com,而Command.com指定执行c:\aa.bat 而且结束时自动Close所有程式如下:
         Private Declare Function OpenProcess Lib "kernel32" _
        (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
        ByVal dwProcessId As Long) As Long

        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 GetExitCodeProcess Lib "kernel32" _
        (ByVal hProcess As Long, lpExitCode As Long) As Long
        Private Declare Function TerminateProcess Lib "kernel32" _
        (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
        Private Declare Function GetForegroundWindow Lib "user32" () As Long
        Private Declare Function IsWindow Lib "user32" _
        (ByVal hwnd As Long) As Long

        Const PROCESS_QUERY_INFORMATION = &H400
        Const STILL_ALIVE = &H103
        Const INFIN99vE = &HFFFF

        Private ExitCode As Long
        Private hProcess As Long
        Private isDone As Long
        Private Sub Command1_Click()
        Dim pid As Long
        pid = Shell("C:\tools\spe\pe2.exe", vbNormalFocus)
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
        isDone = False
        Do
        Call GetExitCodeProcess(hProcess, ExitCode)
        Debug.Print ExitCode
        DoEvents
        Loop While ExitCode = STILL_ALIVE
        Call CloseHandle(hProcess)
        isDone = True
        End Sub

        Private Sub Command2_Click()
        Dim pid As Long
        Dim ExitEvent As Long
        pid = Shell("C:\tools\spe3\pe2.exe", vbNormalFocus)
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
        ExitEvent = WaitForSingleObject(hProcess, INFIN99vE)
        Call CloseHandle(hProcess)
        End Sub

        Private Sub Command3_Click()
        Dim aa As Long
        If hProcess <> 0 Then
        aa = TerminateProcess(hProcess, 3838)
        End If

        End Sub

        Private Sub Command4_Click()
        Dim pid As Long
        Dim hwnd5 As Long
        pid = Shell("c:\tools\spe3\pe2.exe", vbNormalFocus)
        hwnd5 = GetForegroundWindow()
        isDone = False
        Do While IsWindow(hwnd5)
        DoEvents
        Loop
        isDone = True
        End Sub

        Private Sub Command5_Click()
        Dim pid As Long
        'pid = Shell("c:\windows\command\xcopy c:\aa.bat a:", vbHide)
        pid = Shell("c:\command.com /c c:\aa.bat", vbNormalFocus)
        End Sub


         http://blog.csdn.net/szwangdf/archive/2007/01/29/1496640.aspx

  「Modest」:

  在使用shell后,如何等待此程序完成后,程序才继续执行。我们使用 shell 调用一个外部程序的时候,通常 vb(a) 会在调用之后继续下面的语句,而不管此 shell 程序执行完成没有。有时我们需要在此 shell 执行完成之后才继续,又当如何呢?
 
  请看源程:

         Public Declare Function OpenProcess Lib "kernel32" Alias "OpenProcess" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
        Public Declare Function WaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
        Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
        Dim lngPId As Long
        Dim lngPHandle As Long
        lngPId = Shell("Notepad", vbNormalFocus)
        lngPHandle = OpenProcess(SYNCHRONIZE, 0, lngpId)
        If lngPHandle <> 0 Then
            Call WaitForSingleObject(lngPHandle, INFINITE) ' 无限等待, 直到程式结束
            Call CloseHandle(lngPHandle)
        End If

上一页  [1] [2] [3] 下一页

【责编:michael】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航