Kontakt
DSVGO
Historie | |
04.06.2001 | Erste Version (nach einer Idee von Francesco Balena) |
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!
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
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