Hallo
Ich versuche gerade, in VBA 2008 eine Konsolenanwendung zu starten und die Ausgaben von „stderr“ auf eine Textbox „tbstderr“ umzuleiten. Den Aufruf der Anwendung habe ich folgendermaßen realisiert:
Private Sub MainForm\_Loaded(ByVal sender As System.Object, \_
ByVal e As System.EventArgs) \_
Handles MyBase.Shown
Dim myProcess As New Process()
'Name und Parameter der Anwendung
Dim psi As New ProcessStartInfo("progname", "parameter")
'Konsole verstecken
psi.CreateNoWindow = True
psi.WindowStyle = ProcessWindowStyle.Hidden
psi.UseShellExecute = False
'stderr umleiten
psi.RedirectStandardError = True
AddHandler myProcess.ErrorDataReceived, AddressOf myStderr
myProcess.EnableRaisingEvents = True
'Prozess starten
myProcess.StartInfo = psi
myProcess.Start()
'Asynchrones Lesen starten
myProcess.BeginErrorReadLine()
'Warten, bis Prozess beendet ist
myProcess.WaitForExit()
End Sub
Jedesmal, wenn die Anwendung eine Zeile auf „stderr“ schreibt, wird der folgende Handler aufgerufen:
Private Sub myStderr(ByVal sendingProcess As Object, \_
ByVal outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
Me.tbstderr.AppendText(outLine.Data)
End If
End Sub
Der Befehl „Me.tbstderr.AppendText(outLine.Data)“, mit dem ich die Daten in die Textbox schreiben will, erzeugt die Fehlermeldung:
„Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbstderr erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.“
Wenn dieser Befehl weggelassen wird läuft das Programm fehlerfrei (es wird natürlich nichts ausgegeben). Durch den Debuggger kann man sehen, daß die korrekten Texte im Parameter „outLine.Data“ enthalten sind.