Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Shell / Std.In/Out

Standard-Eingabe lesen, -Ausgabe schreiben

Impressum
Kontakt
DSVGO
Historie
04.06.2001Erste Version (nach einer Idee von Francesco Balena)

Einleitung

Möchte man ein VB-Programm als sogenannten Filter in einer Shell einsetzen, so müssen Zeichen aus einem Eingabestrom gelesen, durch das VB-Programm verarbeitet, und dann wieder in den Ausgabestrom geschrieben werden. Die unten beschriebenden Funktionen StdWrite und StdRead erlauben genau dies.

Hinweis: Die Standard-Ein- und Ausgabe kann nur aus einem kompiliertem Programm heraus benutzt werden. D.h. in der Entwicklungsumgebung können diese Routinen nicht funktionieren!

Beispiel

Das folgende Programm definiert einen (trivialen) Filter, der einfach alle Zeichen in Kleinbuchstaben konvertiert. Bitte nicht vergessen: Unter "Projekt/Eigenschaften" muss die Prozedur "Main" als Startobjekt eingetragen sein. Weiterhin muss das Programm im Beispiel als "C:\LCase.exe" kompiliert werden.

Sub Main()
  Dim s As String
  
  'Aus Eingabestrom lesen:
  s = StdRead

  'Filter' anwenden:
  s = LCase$(s)

  'In Ausgabestrom schreiben:
  StdWrite s
End Sub

Die folgende Zeile in der Eingabeaufforderung erzeugt eine Liste aller Systemvariablen, wobei jeglicher Text in Kleinschreibung erscheint.

C:\> set | LCase.exe | more

Code

Folgende API-Funktionen müssen im Deklarationsteil eines Formulars oder (besser!) eines Moduls bekanntgemacht werden:

Private Declare Function GetStdHandle Lib "kernel32" ( _
    ByVal nStdHandle As Long) As Long
Private Declare Function ReadFile Lib "kernel32" ( _
    ByVal hFile As Long, lpBuffer As Any, _
    ByVal nNumberOfBytesToRead As Long, _
    lpNumberOfBytesRead As Long, _
    lpOverlapped As Any) As Long
Private Declare Function WriteFile Lib "kernel32" ( _
    ByVal hFile As Long, lpBuffer As Any, _
    ByVal nNumberOfBytesToWrite As Long, _
    lpNumberOfBytesWritten As Long, _
    lpOverlapped As Any) As Long

Die folgende Funktion gibt einen Text auf der Standard-Ausgabe aus. Die Anzahl der geschriebenen Zeichen wird zurückgegeben:

Function StdWrite(ByVal Text As String) As Long
  Const STD_OUTPUT_HANDLE = -11&
  Dim Handle As Long
  
  Handle = GetStdHandle(STD_OUTPUT_HANDLE)
  WriteFile Handle, ByVal Text, Len(Text), StdWrite, ByVal 0&
End Function

Die folgende Funktion liest solange die Standard-Eingabe, bis keine Zeichen mehr geliefert werden:

Function StdRead() As String
  Const STD_INPUT_HANDLE = -10&
  Dim Handle As Long
  Dim Buffer As String * 2048
  Dim Bytes As Long
  
  Handle = GetStdHandle(STD_INPUT_HANDLE)
  Do
    ReadFile Handle, ByVal Buffer, Len(Buffer), Bytes, ByVal 0&
    If Bytes < Len(Buffer) Then Exit Do
    StdRead = StdRead & Buffer
  Loop
  StdRead = StdRead & Left$(Buffer, Bytes)
End Function

© Jost Schwider, 04.06.2001-12.07.2009 - http://vb-tec.de/stdinout.htm