如果我在C#winform应用程序中重定向用Delphi编写的控制台应用程序,则进程立即退出

时间:2012-12-05 18:05:27

标签: c# delphi console io-redirection

我有一个用Delphi编写的控制台应用程序(Host.exe)。 我想在C#应用程序(WinForm)中重定向控制台应用程序的输出。

如果我使用以下内容,则会调用(Host.exe)而不会出现问题,但由于它是以(show-window,相当独立的方式)运行,因此无法获得输出。

                ProcessStartInfo pp = new ProcessStartInfo();
                pp.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
                pp.FileName = Path.Combine(pp.WorkingDirectory, "Host.exe");
                pp.CreateNoWindow = false;
                pp.WindowStyle = ProcessWindowStyle.Normal;
                pp.UseShellExecute = true;
                using (Process pProcess = Process.Start(pp))
                {
                    while ((pProcess != null) && (!pProcess.HasExited))
                    {
                        Application.DoEvents();
                        Thread.Sleep(updatefreq);
                    }
                }

但是,如果我尝试捕获输出(重定向),则进程将立即退出(HasExited = true,循环中断,调试器显示,“只有部分ReadProcessMemory或WriteProcessMemory请求已完成”。

                ProcessStartInfo pp = new ProcessStartInfo();
                pp.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
                pp.FileName = Path.Combine(pp.WorkingDirectory, "Host.exe");
                pp.UseShellExecute = false;
                pp.RedirectStandardOutput = true;
                pp.RedirectStandardInput = true;
                pp.RedirectStandardError = true;
                pp.CreateNoWindow = true;
                pp.WindowStyle = ProcessWindowStyle.Hidden;
                StreamReader outputReader = null;
                using (Process pProcess = Process.Start(pp))
                {
                    if (pProcess != null)
                    {
                        //StreamWriter inputWriter = pProcess.StandardInput;
                        //StreamReader errorReader = pProcess.StandardError;
                        outputReader = pProcess.StandardOutput;
                    }
                    while ((pProcess != null) && (!pProcess.HasExited))
                    {
                        string ss = null;
                        if (outputReader != null)
                        {
                            ss = outputReader.ReadLine();
                        }
                        if ((ss != null) && (2 < ss.Length))
                        {
                            string[] s = ss.Split('|');
                            if (3 == s.Length)
                            {
                                float global;
                                //float.TryParse(s[0], out local);
                                float.TryParse(s[1], out global);
                                RadioTracer.SetCurrentMsg(s[2]);
                                RadioTracer.SetCurrentStep((int)global);
                            }
                        }
                        Application.DoEvents();
                        Thread.Sleep(updatefreq);
                    }
                }

我已经google了很多但没有得到解决方案。 以下页面提出了类似的问题,我尝试了建议的解决方案,但没有任何作用。

https://connect.microsoft.com/VisualStudio/feedback/details/609801/unable-to-redirect-only-the-standard-input-of-process-cmd-exe-or-batch-file-from-windows-form-application

http://go4answers.webhost4life.com/Example/redirectstandardinput-a-32-bit-114440.aspx

http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/4f946750-6c47-406c-810c-21a2b103b5c4

非常感谢...这已经浪费了我很多时间..我希望我能在这里找到解决方案。

编辑:即使我不使用任何ReadLine()或ReadToEnd()方法,问题仍然存在。当'UseShellExecute'设置为false时,Host.exe将立即退出.. Host.exe应该进行一些大的计算(大约需要2分钟,并且每隔几秒通过控制台WriteLine报告进度)。

1 个答案:

答案 0 :(得分:1)

我发现如果在C#中重定向输出,以下行将导致错误。我在Delphi中使用Console.pas单元,在该单元的初始化中,它调用InitScreenMode过程。

  Reset(Input);
  Rewrite(Output);
  StdIn := TTextRec(Input).Handle;
  StdOut := TTextRec(Output).Handle;

我猜测'重置'或'重写'控制台stdin / stdout会在C#中将'UseShellExecute'设置为false时导致问题