title image


Smiley Re: Commandozeilenfrage... ;)
Inhalt:

1. Aufruf-Beispiel

2. DOSOutputs-Klasse



1. Aufruf-Beispiel

Option Explicit'Zweck: Start-ModulSub Main()   ' Objekt-Deklaration   Dim objDos As DOSOutputs   ' Objekt initialisieren   Set objDos = New DOSOutputs   ' Anwendung starten   objDos.ExecuteCommand "NET /?"   ' DOS-Ausgabe-Wert ausgeben   MsgBox objDos.Outputs   ' Objekt zerstören   Set objDos = NothingEnd Sub



2. DOSOutputs-Klasse

'Zweck:       Dieser Objekt wurde erstellt um ausgegebenen Text eines DOS-Programms zu empfangen.'Bemerkung:   Dieser Objekt funktioniert mit 16-bit Anwendungen auf Win9x and WinME nicht.'Autor:       Andreas Graf'Erstellt am: 2002-02-30'Geändert am: 2002-05-13Option Explicit'Zweck:     The CreatePipe function creates an anonymous pipe, and returns handles to the read and write ends of the pipe.'Parameter: hReadPipe        Pointer to a variable that receives the read handle for the pipe.'Parameter: hWritePipe       Pointer to a variable that receives the write handle for the pipe.'Parameter: lpPipeAttributes Pointer to a structure that determines whether the returned handle can be inherited by child processes. If lpPipeAttributes is NULL, the handle cannot be inherited.<br>Windows NT/2000: The lpSecurityDescriptor member of the structure specifies a security descriptor for the new pipe. If lpPipeAttributes is NULL, the pipe gets a default security descriptor.'Parameter: nSize            Specifies the buffer size for the pipe, in bytes. The size is only a suggestion; the system uses the value to calculate an appropriate buffering mechanism. If this parameter is zero, the system uses the default buffer size.Private Declare Function CreatePipe Lib "kernel32" (hReadPipe As Long, hWritePipe As Long, lpPipeAttributes As Any, ByVal nSize As Long) As Long'Zweck:     The ReadFile function reads data from a file, starting at the position indicated by the file pointer.'Parameter: hFile                Identifies the file to be read. The file handle must have been created with GENERIC_READ access to the file.<br>· Windows NT: For asynchronous read operations, hFile can be any handle opened with the FILE_FLAG_OVERLAPPED flag by the CreateFile function, or a socket handle returned by the socket or accept functions.<br>· Windows 95: For asynchronous read operations, hFile can be a communications resource, mailslot, or named pipe handle opened with the FILE_FLAG_OVERLAPPED flag by CreateFile, or a socket handle returned by the socket or accept functions. Windows 95 does not support asynchronous read operations on disk files.'Parameter: lpBuffer             Points to the buffer that receives the data read from the file.'Parameter: nNumberOfBytesToRead Specifies the number of bytes to be read from the file.'Parameter: lpNumberOfBytesRead  Points to the number of bytes read. ReadFile sets this value to zero before doing any work or error checking. If this parameter is zero when ReadFile returns TRUE on a named pipe, the other end of the message-mode pipe called the WriteFile function with nNumberOfBytesToWrite set to zero.'Parameter: lpOverlapped         Points to an OVERLAPPED structure. This structure is required if hFile was created with FILE_FLAG_OVERLAPPED.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'Zweck:     ;o)'Bemerkung: Diese Struktur wird von CreateProcessA-Funktion benutzt.Private Type SECURITY_ATTRIBUTES    nLength As Long    lpSecurityDescriptor As Long    bInheritHandle As LongEnd Type'Zweck:     ;o)'Bemerkung: Diese Struktur wird von CreateProcessA-Funktion benutzt.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 LongEnd Type'Zweck:     ;o)'Bemerkung: Diese Struktur wird von CreateProcessA-Funktion benutzt.Private Type PROCESS_INFORMATION    hProcess As Long    hThread As Long    dwProcessID As Long    dwThreadID As LongEnd Type'Zweck:     The CreateProcess function creates a new process and its primary thread. The new process executes the specified executable file.'Parameter: lpApplicationName    Pointer to a null-terminated string that specifies the module to execute.'Parameter: lpCommandLine        Pointer to a null-terminated string that specifies the command line to execute.'Parameter: lpProcessAttributes  Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If lpProcessAttributes is NULL, the handle cannot be inherited.'Parameter: lpThreadAttributes   Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If lpThreadAttributes is NULL, the handle cannot be inherited.'Parameter: bInheritHandles      Indicates whether the new process inherits handles from the calling process. If TRUE, each inheritable open handle in the calling process is inherited by the new process. Inherited handles have the same value and access privileges as the original handles.'Parameter: dwCreationFlags      Specifies additional flags that control the priority class and the creation of the process.'Parameter: lpEnvironment        Points to an environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process. An environment block consists of a null-terminated block of null-terminated strings.'Parameter: lpCurrentDirectory   Points to a null-terminated string that specifies the current drive and directory for the child process. The string must be a full path and filename that includes a drive letter. If this parameter is NULL, the new process is created with the same current drive and directory as the calling process. This option is provided primarily for shells that need to start an application and specify its initial drive and working directory.'Parameter: lpStartupInfo        Points to a STARTUPINFO structure that specifies how the main window for the new process should appear.'Parameter: lpProcessInformation Points to a PROCESS_INFORMATION structure that receives identification information about the new process.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'Zweck:     The CloseHandle function closes an open object handle.'Parameter: hHandle Identifies an open object handle.Private Declare Function CloseHandle Lib "kernel32" (ByVal hHandle As Long) As Long'Zweck: The WaitForSingleObject function returns when one of the following occurs:<br>· The specified object is in the signaled state.<br>· The time-out interval elapses.Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPrivate Const NORMAL_PRIORITY_CLASS = &H20&  ';o)Private Const STARTF_USESTDHANDLES = &H100&  ';o)Private Const STARTF_USESHOWWINDOW = &H1     ';o)Private Const INFINITE = &HFFFF              ';o)Private sCommand As String 'Diese Variable wird für CommandLine-Funktion benötigt.Private sOutputs As String 'Diese Variable wird für Outputs-Eigenschaft benötigt.'Zweck: Dieser Ereignis wird für die Informierung des Ojektes benötigt.Public Event ReceiveOutputs(CommandOutputs As String)'Zweck: Diese Eigenschaft gibt den ausgegebenen Text eines DOS-Programms zurück.Public Property Get CommandLine() As String   CommandLine = sCommandEnd Property'Zweck:     Diese Eigenschaft legt die DOS-Befehlszeile fest.'Parameter: DOSCommand bestimmt die DOS-Befehlszeile des Objektet, die später ausgeführt werden kann.Public Property Let CommandLine(ByVal DOSCommand As String)   sCommand = DOSCommandEnd Property'Zweck: Diese Eigenschaft gibt den kompletten, ausgegebenen Text eines DOS-Programms zurück.Public Property Get Outputs()   Outputs = sOutputsEnd Property'Zweck:     Diese Funktion startet ein Programm und wartet, bis es beendet ist.'Parameter: CommandLine DOS-Befehlszeile, die ausgeführt wird.Public Function ExecuteCommand(Optional ByVal CommandLine As String) As Boolean   Dim proc         As PROCESS_INFORMATION 'Process info filled by CreateProcessA   Dim nReturn      As Long                'long variable for get the return value of the API functions   Dim Start        As STARTUPINFO         'StartUp Info passed to the CreateProceeeA function   Dim SA           As SECURITY_ATTRIBUTES 'Security Attributes passeed to the CreateProcessA function   Dim nReadPipe    As Long                'Read Pipe handle created by CreatePipe   Dim nWritePipe   As Long                'Write Pite handle created by CreatePipe   Dim nBytesread   As Long                'Amount of byte read from the Read Pipe handle   Dim sBuffer      As String * 256        'String buffer reading the Pipe   'Wenn etwas schief geht, dann wird False zurückgemeldet.   ExecuteCommand = False   'Wenn der Parameter CommandLine leer ist, dann abfragen.   If Len(CommandLine) > 0 Then      sCommand = CommandLine   End If   'Wenn der Parameter CommandLine immer noch leer ist, dann im Debud-Modus Meldung ausgeben.   If Len(sCommand) = 0 Then      Debug.Print "DOSOutputs:ExecuteCommand -> CommandLine-Eigenschaft ist leer!"      Exit Function   End If   '"Pipe" erstellen.   SA.nLength = Len(SA)   SA.bInheritHandle = 1&   SA.lpSecurityDescriptor = 0&   nReturn = CreatePipe(nReadPipe, nWritePipe, SA, 0)   'Wenn ein Fehler auftritt, wird es dem Benutzer zurückgemeldet.   If nReturn = 0 Then      MsgBox "CreatePipe fehlgeschlagen. Fehler: " & Err.LastDllError, vbCritical      Exit Function   End If   'DOS-Befehltzeile aufruffen.   Start.cb = Len(Start)   Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW   'StdOutput und StdError auf eine gleichs "Write Pipe"-Handle setzen   Start.hStdOutput = nWritePipe   Start.hStdError = nWritePipe   'DOS-Befehltzeile ausführen.   nReturn = CreateProcessA(0&, sCommand, SA, SA, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)   'Wenn die DOS-Befehltzeile nicht gefunden wurde, dann...   If nReturn <> 1 Then      MsgBox "Datei oder Kommande wurde nicht gefunden!", vbCritical      Exit Function   End If   'nWritePipe schliessen.   nReturn = CloseHandle(nWritePipe)   sOutputs = ""   '"ReadPipe"-Handle lesen   Do      nReturn = ReadFile(nReadPipe, sBuffer, 256, nBytesread, 0&)      sOutputs = sOutputs & Left(sBuffer, nBytesread)   Loop While nReturn <> 0   'Daten mit Hilfe vom "ReceiveOutputs"-Ereignis and den Objekt senden.   RaiseEvent ReceiveOutputs(sOutputs)   'Alle geöffnete Handles schliessen.   nReturn = CloseHandle(proc.hProcess)   nReturn = CloseHandle(proc.hThread)   nReturn = CloseHandle(nReadPipe)   'Wenn ales sauber abgelaufen ist, wird True zurückgemeldet   ExecuteCommand = TrueEnd Function


Mit freundlichen Grüßen

AndyG

E-Mail:  Andreas_Graf [öt] DevPlanet.de
Homepage:  http://www.DevPlanet.de



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: