请问用Shell调用外部程序时,如何判断所调用的外部程序已经完成?

解决方案 »

  1.   

    当用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 
      

  2.   

    需要用到WaitForSingleObject函数;
      

  3.   

    http://community.csdn.net/Expert/topic/3218/3218324.xml?temp=4.446048E-02http://www.yesky.com/20011026/202385_4.shtml
      

  4.   

    参见:http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q129/7/96.asp&NoWebContent=1
      

  5.   

    当然用DDE在结束前通信也可能实现,这样两个程序都能运行
      

  6.   

    http://community.csdn.net/Expert/topic/3218/3218324.xml?temp=.3550989
      

  7.   

    谢谢各位,上面的俺都尝试过了,如果调用exe的话,是没有问题,但如果调用.bat文件的时候好像不行了,例如在bat文件里面我要启动Sql Server服务。
      

  8.   

    启动sql服务用这个exe 
    scm.exe -action 1 -service mssqlserver
      

  9.   

    同意 starsoulxp(星魂.NET) 的说法,这样可以,我用过。
      

  10.   

    to  apple800(老五):谢谢你,这个我也试过了,但我想要的就像sqlserver 那个“服务管理器”那样,启动的时候不弹出东西,启动完也不弹出东西,to zhysecond(太阳伞): starsoulxp(星魂.NET)的做法和说法都没有错,我也尝试了,但当我执行bat文件时,它还是不能捕捉当前bat是否已经结束了bat文件里面是启动sqlserver服务,然后在程序启动的时候调用那个bat来启动sqlserver服务,当启动完成了,程序再连接到刚才启动的那个实例上以上只是我的一个想法,如果各位高手有更好的做法,请告知,谢谢
      

  11.   

    不用shell,window提供了相应的api启动和停止服务,具体的参考:
    http://community.csdn.net/Expert/topic/3283/3283596.xml?temp=.9963953