具体是用SHELL 调用一个BATCH后来处理一段ORACLE PROCEDURE(由于是DB LINK,CLIENT端不能执行,只能在服务器的SQLPLUS下运行该PROCEDURE)。该过程将几个表的数据从另一个服务器导入到我的服务器,我要做的就是希望在数据导入进行的时候,程序能够暂时停止,直到数据导入完毕后,才进行后面的程序(后面的程序要用到这些导入的数据)。有什么的好的方法吗?最好有代码示例,这方面我不太熟!

解决方案 »

  1.   

    ' 下面的函数可以实现在调用shell后等待程序执行结束后再执行后面的代码。
    ' 放到标准模块中就可以窗体模块中调用了。Option ExplicitPrivate 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
    Const SYNCHRONIZE = &H100000
    Const WAIT_TIMEOUT = &H102&' 以同步方式运行另一个程序, 该程序运行结束后才执行函数后面的语句
    ' AppName 为执行应用程序的文件名, ShowWindow 为窗口的显示方式
    Function ShellForWait(ByVal AppName As String, Optional ByVal ShowWindow As VbAppWinStyle = vbMinimizedFocus) As Boolean
    Dim ID As Long, hwnd As Long, ret As Long
    On Error Resume Next
    ID = Shell(AppName, ShowWindow)
    If ID > 0 Then
        hwnd = OpenProcess(SYNCHRONIZE, 0, ID)
        If hwnd <> 0 Then
            Do
                ret = WaitForSingleObject(hwnd, 0)
                DoEvents
            Loop While ret = WAIT_TIMEOUT
            CloseHandle hwnd
            ShellForWait = True
        Else
            ShellForWait = False
        End If
    Else
        ShellForWait = False
    End If
    End Function
      

  2.   

    支持  goodname008(卢培培,想学好VB)   
    这么晚了还在努力工作
    呵呵学习学习
      

  3.   

    goodname008(卢培培,想学好VB)  的方法不可行.我刚试过了.
      

  4.   

    通常用的就是 goodname008(卢培培,想学好VB) 的方法
      

  5.   

    Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessid As Long
        dwThreadID As Long
    End Type
    Private Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
    End Type
    Private Const STARTF_USESHOWWINDOW = &H1
    Private Const SW_HIDE = 0
    Private Const NORMAL_PRIORITY_CLASS = &H20&
    Private Declare Function CreateProcessA Lib "kernel32" ( _
       ByVal lpApplicationName As Long, _
       ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal _
       lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal _
       dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal _
       lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, _
       lpProcessInformation As PROCESS_INFORMATION) As Long
    Private Const INFINITE = -1&
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Sub Command1_Click()
        Dim cmdLine As String
        Dim workDir As String
        Dim NameOfProc As PROCESS_INFORMATION
        Dim NameStart As STARTUPINFO
        Dim returnValue As Long
        
        cmdLine = "c:\winnt\system32\notepad.exe"
        workDir = "c:\winnt\system32"    NameStart.cb = Len(NameStart)
        NameStart.dwFlags = STARTF_USESHOWWINDOW
        NameStart.wShowWindow = SW_HIDE
        returnValue = CreateProcessA(0&, cmdLine$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, workDir$, NameStart, NameOfProc)
        returnValue = WaitForSingleObject(NameOfProc.hProcess, INFINITE)
    End Sub