Visual Basic(Visual Studio 2005)将输入流重定向到进程

问题描述:

我一直在网上搜索大约三个小时,现在无法前进。我不太了解VB,但我需要为任何记录参数,所有输入,输出和err信息的可执行文件创建一个包装程序:Visual Basic(Visual Studio 2005)将输入流重定向到进程

  • 我的包装被调用:例如someApp.exe ARG1 ARG2
  • 日志到someApp.log:ARG1 ARG2
  • 呼叫原始可执行:_someApp.exe ARG1 ARG2
  • 必须登录和转发任何控制台输入_someApp过程的InputStream
  • 必须登录的任何输出和从_someApp过程错误流

好吧,我在点4卡住了:

 Dim p As New ProcessStartInfo 
     p.FileName = execute 
     p.Arguments = Command() 
     p.UseShellExecute = False 
     p.CreateNoWindow = True 
     p.RedirectStandardInput = True 
     p.RedirectStandardError = True 
     p.RedirectStandardOutput = True 

     Dim process As System.Diagnostics.Process 
     process = Diagnostics.Process.Start(p) 
     process.WaitForExit() 

_some后应用程序结束我可以读出和错误流记录它,但我仍然需要提供我自己的包装输入到过程,我想读出和错误流发生。

感谢信息/例子

好这里的解决方案......

需要的变量:

Private process As System.Diagnostics.Process 

Private threadOut As Thread 

Private streamOut As System.IO.StreamReader 

Private threadErr As Thread 

Private streamErr As System.IO.StreamReader 

Private threadIn As Thread 

Private streamIn As System.IO.StreamWriter 

替补需要:

Private Sub ThreadTaskOut() 
    Dim line 
    While Not process.HasExited 
     line = streamOut.ReadToEnd 
     If line <> Nothing And line <> "" Then 
      log("Out: " & line) 
      Console.Out.Write(line) 
     End If 
    End While 
End Sub 

Private Sub ThreadTaskErr() 
    Dim line 
    While Not process.HasExited 
     line = streamErr.ReadToEnd 
     If line <> Nothing And line <> "" Then 
      log("Err: " & line) 
      Console.Error.Write(line) 
     End If 
    End While 
End Sub 

Private Sub ThreadTaskIn() 
    Dim line 
    While Not process.HasExited 
     line = Console.In.ReadLine 
     If line <> Nothing And line <> "" Then 
      log("In: " & line) 
      streamIn.WriteLine(line) 
     End If 
    End While 
End Sub 

在main:

 ' create process information 
     Dim p As New ProcessStartInfo 
     p.FileName = execute 
     p.Arguments = Command() 
     p.UseShellExecute = False 
     p.CreateNoWindow = True 
     p.RedirectStandardInput = True 
     p.RedirectStandardError = True 
     p.RedirectStandardOutput = True 

     ' log process start 
     log("Execute: " & execute & " " & Command()) 

     ' start process 
     process = Diagnostics.Process.Start(p) 

     ' start thread for output stream 
     streamOut = process.StandardOutput 
     threadOut = New Thread(AddressOf ThreadTaskOut) 
     threadOut.IsBackground = True 
     threadOut.Start() 

     ' start thread for error stream 
     streamErr = process.StandardError 
     threadErr = New Thread(AddressOf ThreadTaskErr) 
     threadErr.IsBackground = True 
     threadErr.Start() 

     ' start thread for input stream 
     streamIn = process.StandardInput 
     threadIn = New Thread(AddressOf ThreadTaskIn) 
     threadIn.IsBackground = True 
     threadIn.Start() 

     ' wait for the process to finish 
     process.WaitForExit() 

日志是另一个子登录到文件,执行的是变量保持_someApp.exe frommy初始讯息。我仍然不知道输入流线程的控制台是否适合,因为我的包装应用程序没有输入,因为它看起来像。五月有人spotts错误...

对于我而言,嗯它就像我需要它

格尔茨, GHAD

代码里面主要

+0

请务必阅读关于RedirectStandardOutput和RedirectStandardError的文档,以了解在重定向两者时可能发生的潜在死锁。 – 2009-10-26 20:16:43

+0

感谢您的建议。我已经阅读过这些部分,但我完全不了解它。但我想我也读过,你可以在没有死锁的线程中完成它。所以这就是我使用它们的原因,不应该有任何死锁afaik。 Greetz,GHad – GHad 2009-10-27 16:12:35

如何编写到应用程序:

Dim sw as IO.StreamWriter = process.StandardInput 
sw.WriteLine("Boo") 

,并从标准输出阅读:

Dim sr As IO.StreamReader = process.StandardOutput 
Do 
    aString = sr.ReadLine() 
Loop Until (sr.EndOfStream) 
+0

是的,我知道我可以写入和从进程中读取,但我需要编写我的应用程序输入,因为它发生在进程输入流中,并且我需要从进程读取和错误流读取,因为它发生了。无论如何感谢 – GHad 2009-10-22 13:46:24

+0

我现在看到。那你为什么要调用process.waitForExit()?根据文档,这个程序在程序退出之前会无限制地停止。我认为你不想那样做。 – RobS 2009-10-22 13:54:09

+0

是的,我知道这一点,但目前这是我知道读出和错误流的唯一途径:在程序退出后。我需要一种方式来读取额外的线程或类似的东西,非阻塞是关键。但我不知道如何在VB中创建这样的线程,因为我对这个主题不太感兴趣。Greetz,Ghad – GHad 2009-10-22 14:19:07