VB.NET-Tipp 0019: Konsolenausgaben in eigene Programm umleiten
von Herfried Wagner
Beschreibung
Dieses Beispiel startet die Konsole oder eine andere Anwendung und leitet ihre Ausgaben in das Programm um. Auf diese Weise lässt sich eine Konsole bauen, die der Windows-Konsole ähnlich ist. Natürlich können darin keine grafischen Konsolenprogramme ausgeführt werden. Durch eine kleine Änderung ist es mit dieser Methode möglich, die Ausgaben eines speziellen Programms (beispielsweise ping oder netstat) direkt im Programm zu verarbeiten.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2002/2003 ' Option Strict: An ' Option Explicit: An ' ' Referenzen: ' - System ' - System.Windows.Forms ' - System.Drawing ' ' ############################################################################## ' ################################ MainForm.vb ################################# ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports Microsoft.VisualBasic Imports System.Diagnostics Imports System.Threading Imports System.Windows.Forms ' <remarks> ' Hauptformular der Anwendung. ' </remarks> Public Class MainForm Inherits System.Windows.Forms.Form Private m_Process As Process Private m_OutputThread As Thread Private m_ErrorThread As Thread Private m_strTextToAdd As String ' <summary> ' Schreibt den im Parameter <paramref name="strText"/> ' angebenen Text auf den Ausgabestrom. ' </summary> ' <param name="strText">Text, der auf den Ausgabestrom ' geschrieben werden soll.</param> Private Sub StreamInput(ByVal strText As String) m_Process.StandardInput.WriteLine(strText) m_Process.StandardInput.Flush() End Sub ' <summary> ' Liest vom Fehlerstream und gibt die ' gelesenen Informationen aus. ' </summary> Private Sub StreamError() Dim strLine As String = _ m_Process.StandardError.ReadLine() Try Do While strLine.Length >= 0 strLine = m_Process.StandardError.ReadLine() If strLine.Length <> 0 Then AddText(strLine) End If Loop Catch AddText("cmd wurde beendet!") End Try End Sub ' <summary> ' Liest vom Ausgabestream und gibt ' die gelesenen Informationen aus. ' </summary> Private Sub StreamOutput() Dim strLine As String = _ m_Process.StandardOutput.ReadLine() Try Do While strLine.Length >= 0 If strLine.Length <> 0 Then AddText(strLine) End If strLine = m_Process.StandardOutput.ReadLine() Loop Catch AddText("cmd wurde beendet!") End Try End Sub ' <summary> ' Fügt den im Parameter <paramref name="strText"/> ' übergebenen String einer TextBox an. ' </summary> ' <param name="strText">Text, der der TextBox ' hinzugefügt werden soll.</param> Private Sub AddText(ByVal strText As String) m_strTextToAdd = strText Me.Invoke(CType(AddressOf Me.AddTextToTextBox, MethodInvoker)) End Sub ' <summary> ' Wird über Invoking aufgerufen, um einen Text hinzuzufügen. ' <summary> Private Sub AddTextToTextBox() txtConsole.AppendText(String.Concat(m_strTextToAdd, _ ControlChars.NewLine)) txtConsole.SelectionStart = txtConsole.Text.Length End Sub Private Sub MainForm_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load ' Um das Programm zu benutzen, um einen ' Shell-Befehl auf der Konsole auszuführen ' (z.B. netstat oder ping) kann man anstelle ' von "cmd" bei Arguments einfach den ' entsprechenden Befehl (z.B. "ping") einfügen ' und in der Eigenschaft Arguments ' die entsprechenden Attribute ' (beispielsweise bei ping die IP-Adresse) angeben. m_Process = New Process() With m_Process.StartInfo .FileName = "cmd" .Arguments = "" .UseShellExecute = False .CreateNoWindow = True .RedirectStandardOutput = True .RedirectStandardError = True .RedirectStandardInput = True End With m_Process.Start() ' Ändern der Streams, sodass wir bei ' Änderungen etwas mitbekommen. Dim ts1 As ThreadStart = New ThreadStart(AddressOf StreamOutput) m_OutputThread = New Thread(ts1) m_OutputThread.Start() Dim ts2 As ThreadStart = New ThreadStart(AddressOf StreamError) m_ErrorThread = New Thread(ts2) m_ErrorThread.Start() End Sub Private Sub btnSend_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnSend.Click StreamInput(txtCommandInput.Text) txtCommandInput.Clear() End Sub Private Sub MainForm_Closing( _ ByVal sender As Object, _ ByVal e As System.ComponentModel.CancelEventArgs) _ Handles MyBase.Closing m_OutputThread.Abort() m_ErrorThread.Abort() End Sub End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 5 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Dieter Wienesen am 30.04.2008 um 12:14
Hallo,
ich bin noch Anfänger (3 Vormittage Kurs).Ich bekomme bei
"txtConsole" und "txtCommandInput" die Fehlermeldung wurde nicht deklariert.
Ist es möglich, das ganze Programm mal zum lernen zu bekommen?
MfG Dieter Wienesen
Kommentar von Mr. S am 28.04.2007 um 17:18
Ergänzung:
StreamInput("exit")
m_OutputThread.Abort()
m_ErrorThread.Abort()
So geht's auch. Man kann auch beides kombinieren:
StreamInput("exit")
m_OutputThread.Abort()
m_ErrorThread.Abort()
If m_Process.HasExited = False Then m_Process.Kill()
Kommentar von Mr. S am 28.04.2007 um 17:09
m_OutputThread.Abort()
m_ErrorThread.Abort()
m_Process.Kill()
So funktioniert es auch mit dem beenden.
Kommentar von Cal am 05.04.2007 um 10:40
Funktioniert gut, beendet aber nicht richtig. Wenn man das Projekt erstellt und verwendet bleibt immer noch ein Prozess am laufen, obwohl das Fenster bereits geschlossen und damit die Threads abgebrochen wurden.
Kommentar von TommyB am 09.04.2006 um 02:10
Super, funkzt gut, nur leider nicht mit jeder Konsolenanwendung. Ich bräucht das für die Win32 Executable fom Streamripper, und der returnt in StandartOutput so garnichts, leider. Gibts da nen Tip für?