使用C#运行exe文件时清空标准输出

时间:2017-06-15 19:21:38

标签: c# assembly process exe command-prompt

我的问题似乎是一个直截了当的问题,因为之前曾多次被问过。无论如何,我认为我的情况完全不同,我无法找到任何直觉。我有一个从汇编语言编写的代码编译的exe文件,我想使用另一个代码运行此exe并捕获其输出。我是用C#做的,这里是代码:

static string runCommand(string command, string args)
    {
        if (File.Exists(command))
        {
            Process p = new Process();
            p.StartInfo.FileName = command;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.Arguments = args;
            p.Start();
            p.WaitForExit();
            string output = p.StandardOutput.ReadToEnd();
            return output; 
        }
        return "";
    }

目标exe文件的代码非常简单(我正在使用Irvine库):

INCLUDE Irvine32.inc


.data

.code
main proc
    call dumpregs
    exit
main ENDP

end main

命令是exe文件路径, args 是传递给exe文件的参数(请注意,此exe不需要参数)

输出始终等于“”!当我使用命令提示符运行exe时,控制台输出肯定不是空的。这就是我得到的:enter image description here

我还尝试使用python捕获控制台输出,但返回的字符串是awlays empty。

我已经多次这样做但是exe文件是用C#而不是汇编语言编写的,但我认为不应该存在任何差异。

修改

到目前为止尝试的解决方案并由斧头提出:

  1. Capturing console output from a .NET application (C#)
  2. How to spawn a process and capture its STDOUT in .NET? [duplicate]
  3. Process.start: how to get the output?
  4. 他们都没有为我工作

    如果您需要任何进一步的信息,请在评论中告诉我

1 个答案:

答案 0 :(得分:1)

您的C#代码是正确的。捕获控制台进程输出的标准方法是通过将进程对象的StartInfo.RedirectStandardOutput属性设置为true来重定向标准输出,如here所述。这正是你所做的。

问题,如correctly diagnosed by rkhb,是您在辅助流程中使用Irvine32库,其dumpregs的实现调用Win32 WriteConsole function,这不可能是重定向。如果您尝试将标准输出(例如,重定向到管道或文件),则WriteConsole将失败并显示ERROR_INVALID_HANDLEdocumented on MSDN

  

ReadConsoleWriteConsole只能用于控制台句柄; ReadFileWriteFile可以与其他句柄(例如文件或管道)一起使用。 ReadConsoleWriteConsole如果与已重定向且不再是控制台句柄的标准句柄一起使用,则会失败。

与rkhb的评论一样,除了文档之外,这也暗示了解决方案。要支持重定向,您需要更改dumpregs的实现,以便调用WriteFile而不是WriteConsole。这是一个更通用的函数,可以写入任何类型的句柄,包括标准控制台输出( a la WriteConsole您可以将输出重定向到的任何其他类型的对象。一旦你做了这个改变,你当然需要重建Irvine32库。

WriteFile的唯一重要限制是它不支持WriteConsole之类的Unicode输出,但在您的情况下这不是问题。 dumpregs的输出都是ANSI。