VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "DOSOutputs"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False

Private 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

Private Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hHandle As Long) As Long

Private Declare Function CreatePipe Lib "kernel32" ( _
    phReadPipe As Long, _
    phWritePipe As Long, _
    lpPipeAttributes As Any, _
    ByVal nSize As Long) As Long

Private 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

Private Type SECURITY_ATTRIBUTES

    nLength                     As Long
    lpSecurityDescriptor        As Long
    bInheritHandle              As Long
    
End Type

Private Type STARTUPINFO

    cb                          As Long
    lpReserved                  As Long
    lpDesktop                   As Long
    lpTitle                     As Long
    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 Type PROCESS_INFORMATION

    hProcess                    As Long
    hThread                     As Long
    dwProcessID                 As Long
    dwThreadID                  As Long
    
End Type

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1


Public mCommand                 As String
Public mOutputs                 As String

Public Event ReceiveOutputs(CommandOutputs As String)

Public Property Let CommandLine(DosCommand As String)

    mCommand = DosCommand
    
End Property

Public Property Get CommandLine() As String

    CommandLine = mCommand
    
End Property

Public Property Get Outputs()

    Outputs = mOutputs
    
End Property

Public Function ExecuteCommand(Optional CommandLine As String) As String
On Error Resume Next

Dim proc                        As PROCESS_INFORMATION
Dim ret                         As Long
Dim start                       As STARTUPINFO
Dim sa                          As SECURITY_ATTRIBUTES
Dim hReadPipe                   As Long
Dim hWritePipe                  As Long
Dim lngBytesread                As Long
Dim strBuff                     As String * 256

If Len(CommandLine) > 0 Then

        mCommand = CommandLine
        
End If
    
If Len(mCommand) = 0 Then
    
Exit Function

End If
    
    sa.nLength = Len(sa)
    sa.bInheritHandle = 1&
    sa.lpSecurityDescriptor = 0&
    
    ret = CreatePipe(hReadPipe, hWritePipe, sa, 0)
    
If ret = 0 Then
  
Exit Function

End If

    start.cb = Len(start)
    start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW

    start.hStdOutput = hWritePipe
    start.hStdError = hWritePipe

    ret& = CreateProcessA(0&, mCommand, sa, sa, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
        
If ret <> 1 Then
   
Exit Function

End If

    ret = CloseHandle(hWritePipe)
    mOutputs = ""
    
Do
    ret = ReadFile(hReadPipe, strBuff, 256, lngBytesread, 0&)
    mOutputs = mOutputs & Left(strBuff, lngBytesread)
    
RaiseEvent ReceiveOutputs(Left(strBuff, lngBytesread))

Loop While ret <> 0
    
    ret = CloseHandle(proc.hProcess)
    ret = CloseHandle(proc.hThread)
    ret = CloseHandle(hReadPipe)
    
    ExecuteCommand = mOutputs
    
End Function



