在VB里如何调用 .COM类的DOS程序,已经如何监视他
有没有办法取到DOS显示出来的信息

解决方案 »

  1.   

    可以这样 :
      shell  "dir > c:\a.txt" 可以从a.txt取得dir在屏幕上显示的内容
      

  2.   

    to lxqlogo0(群子) 
       能说的具体点吗?
       或者给个列子先谢谢了
      

  3.   

    '下面是我的一个例子,你可以修改:
     Option Explicit
    Public Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
    Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
    Public Type SECURITY_ATTRIBUTES
            nLength As Long
            lpSecurityDescriptor As Long
            bInheritHandle As Long
    End Type
    Public 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
    Public Type PROCESS_INFORMATION
            hProcess As Long
            hThread As Long
            dwProcessId As Long
            dwThreadId As Long
    End Type
    Public Declare Function CreateProcessAsUser Lib "advapi32.dll" Alias "CreateProcessAsUserA" (ByVal hToken As Long, ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As SECURITY_ATTRIBUTES, ByVal lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As String, ByVal lpCurrentDirectory As String, ByVal lpStartupInfo As STARTUPINFO, ByVal lpProcessInformation As PROCESS_INFORMATION) As Long
    Public Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Const NORMAL_PRIORITY_CLASS = &H20
    Public Const STARTF_USESTDHANDLES = &H100
    Public Const STARTF_USESHOWWINDOW = &H1Public Function ExecuteCommandLineOutput(CommandLine As String, Optional BufferSize As Long = 256, Optional TimeOut As Long) As String
    Dim Proc As PROCESS_INFORMATION
    Dim Start As STARTUPINFO
    Dim SA As SECURITY_ATTRIBUTES
    Dim hReadPipe As Long
    Dim hWritePipe As Long
    Dim lBytesRead As Long
    Dim sBuffer As String
    If VBA.Len(CommandLine) > 0 Then
       SA.nLength = Len(SA)
       'sa.nLength = vba.Len(sa)
       SA.bInheritHandle = 1&
       SA.lpSecurityDescriptor = 0&
       If CreatePipe(hReadPipe, hWritePipe, SA, 0) > 0 Then
          Start.cb = Len(Start)
          Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
          Start.hStdOutput = hWritePipe
          Start.hStdError = hWritePipe
          If CreateProcessA(0&, CommandLine, SA, SA, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc) = 1 Then
             CloseHandle hWritePipe
             sBuffer = VBA.String(BufferSize, VBA.Chr(0))
             If TimeOut > 0 Then
                Dim BeginTime As Date
                BeginTime = VBA.Now
             End If
             Do Until ReadFile(hReadPipe, sBuffer, BufferSize, lBytesRead, 0&) = 0
                DoEvents
                If TimeOut > 0 Then
                   If VBA.DateDiff("s", BeginTime, VBA.Now) > TimeOut Then
                      ExecuteCommandLineOutput = "Timeout"
                      Exit Do
                   End If
                End If
                ExecuteCommandLineOutput = ExecuteCommandLineOutput & VBA.Trim(VBA.Replace(VBA.Left(sBuffer, lBytesRead), VBA.Chr(0), ""))
            
             Loop
              DoEvents
             CloseHandle Proc.hProcess
             CloseHandle Proc.hThread
             CloseHandle hReadPipe
          Else
            ExecuteCommandLineOutput = "File or command not found"
          End If
       Else
          ExecuteCommandLineOutput = "CreatePipe failed. Error: " & Err.LastDllError & "."
       End If
    End IfEnd Function
    ''\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
     ’ 调用函数:ExecuteCommandLineOutput就可以了
    filess="路径名+文件名"
    Text1.Text = ExecuteCommandLineOutput("javac " & filess, , 7)
    ''\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    有什么问题我们共同研究。
      

  4.   

    '下面是我的一个例子,你可以修改:
     Option Explicit
    Public Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
    Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
    Public Type SECURITY_ATTRIBUTES
            nLength As Long
            lpSecurityDescriptor As Long
            bInheritHandle As Long
    End Type
    Public 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
    Public Type PROCESS_INFORMATION
            hProcess As Long
            hThread As Long
            dwProcessId As Long
            dwThreadId As Long
    End Type
    Public Declare Function CreateProcessAsUser Lib "advapi32.dll" Alias "CreateProcessAsUserA" (ByVal hToken As Long, ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As SECURITY_ATTRIBUTES, ByVal lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As String, ByVal lpCurrentDirectory As String, ByVal lpStartupInfo As STARTUPINFO, ByVal lpProcessInformation As PROCESS_INFORMATION) As Long
    Public Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Const NORMAL_PRIORITY_CLASS = &H20
    Public Const STARTF_USESTDHANDLES = &H100
    Public Const STARTF_USESHOWWINDOW = &H1Public Function ExecuteCommandLineOutput(CommandLine As String, Optional BufferSize As Long = 256, Optional TimeOut As Long) As String
    Dim Proc As PROCESS_INFORMATION
    Dim Start As STARTUPINFO
    Dim SA As SECURITY_ATTRIBUTES
    Dim hReadPipe As Long
    Dim hWritePipe As Long
    Dim lBytesRead As Long
    Dim sBuffer As String
    If VBA.Len(CommandLine) > 0 Then
       SA.nLength = Len(SA)
       'sa.nLength = vba.Len(sa)
       SA.bInheritHandle = 1&
       SA.lpSecurityDescriptor = 0&
       If CreatePipe(hReadPipe, hWritePipe, SA, 0) > 0 Then
          Start.cb = Len(Start)
          Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
          Start.hStdOutput = hWritePipe
          Start.hStdError = hWritePipe
          If CreateProcessA(0&, CommandLine, SA, SA, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc) = 1 Then
             CloseHandle hWritePipe
             sBuffer = VBA.String(BufferSize, VBA.Chr(0))
             If TimeOut > 0 Then
                Dim BeginTime As Date
                BeginTime = VBA.Now
             End If
             Do Until ReadFile(hReadPipe, sBuffer, BufferSize, lBytesRead, 0&) = 0
                DoEvents
                If TimeOut > 0 Then
                   If VBA.DateDiff("s", BeginTime, VBA.Now) > TimeOut Then
                      ExecuteCommandLineOutput = "Timeout"
                      Exit Do
                   End If
                End If
                ExecuteCommandLineOutput = ExecuteCommandLineOutput & VBA.Trim(VBA.Replace(VBA.Left(sBuffer, lBytesRead), VBA.Chr(0), ""))
            
             Loop
              DoEvents
             CloseHandle Proc.hProcess
             CloseHandle Proc.hThread
             CloseHandle hReadPipe
          Else
            ExecuteCommandLineOutput = "File or command not found"
          End If
       Else
          ExecuteCommandLineOutput = "CreatePipe failed. Error: " & Err.LastDllError & "."
       End If
    End IfEnd Function
    ''\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
     ’ 调用函数:ExecuteCommandLineOutput就可以了
    filess="路径名+文件名"
    Text1.Text = ExecuteCommandLineOutput("javac " & filess, , 7)
    ''\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    有什么问题我们共同研究。
      

  5.   

    不行啊每次都是走到这里了
    ExecuteCommandLineOutput = "File or command not found"
      

  6.   

    我要运行的e:\fileIO\FRSH_0C.com
    filess="e:\fileIO\FRSH_0C.com"吗?还是??