Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0019: Konsolenausgaben in eigene Programm umleiten

 von 

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:

Schwierigkeitsgrad 1

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:

Download des Beispielprojektes [3,79 KB]

' 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?