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
代码里面主要
如何编写到应用程序:
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)
是的,我知道我可以写入和从进程中读取,但我需要编写我的应用程序输入,因为它发生在进程输入流中,并且我需要从进程读取和错误流读取,因为它发生了。无论如何感谢 – GHad 2009-10-22 13:46:24
我现在看到。那你为什么要调用process.waitForExit()?根据文档,这个程序在程序退出之前会无限制地停止。我认为你不想那样做。 – RobS 2009-10-22 13:54:09
是的,我知道这一点,但目前这是我知道读出和错误流的唯一途径:在程序退出后。我需要一种方式来读取额外的线程或类似的东西,非阻塞是关键。但我不知道如何在VB中创建这样的线程,因为我对这个主题不太感兴趣。Greetz,Ghad – GHad 2009-10-22 14:19:07
请务必阅读关于RedirectStandardOutput和RedirectStandardError的文档,以了解在重定向两者时可能发生的潜在死锁。 – 2009-10-26 20:16:43
感谢您的建议。我已经阅读过这些部分,但我完全不了解它。但我想我也读过,你可以在没有死锁的线程中完成它。所以这就是我使用它们的原因,不应该有任何死锁afaik。 Greetz,GHad – GHad 2009-10-27 16:12:35