C# 使用C运行exe文件时,标准输出为空#
我的问题可能看起来很直截了当,因为它以前被问过很多次。无论如何,我认为我的情况完全不同,我找不到任何关于它的直觉。我有一个用汇编语言编写的代码编译的exe文件,我想用另一个代码运行这个exe并捕获它的输出。我是用C#完成的,下面是代码:C# 使用C运行exe文件时,标准输出为空#,c#,assembly,process,exe,command-prompt,C#,Assembly,Process,Exe,Command Prompt,我的问题可能看起来很直截了当,因为它以前被问过很多次。无论如何,我认为我的情况完全不同,我找不到任何关于它的直觉。我有一个用汇编语言编写的代码编译的exe文件,我想用另一个代码运行这个exe并捕获它的输出。我是用C#完成的,下面是代码: static string runCommand(string command, string args) { if (File.Exists(command)) { Process p = new
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库):
其中,command是exe文件路径,args是传递给exe文件的参数(请注意,此exe不需要任何参数)
输出总是等于“”!。当我使用命令提示符运行exe时,控制台输出肯定不是空的。下面是我得到的:
我还尝试使用python捕获控制台输出,但返回的字符串为空
我已经这样做过好几次了,但是exe文件是用C#而不是汇编语言编写的,但是我认为它不应该存在任何差异
编辑
迄今为止尝试的解决方案和哈切特建议的解决方案:
他们都不为我工作
如果您需要任何进一步的信息,请在评论中告诉我您的C#代码是正确的。捕获控制台进程输出的标准方法是通过将进程对象的StartInfo.RedirectStandardOutput
属性设置为true
,重定向标准输出,如前所述。这正是你所做的
例如,问题是您在辅助进程中使用Irvine32库,其dumpregs
的实现调用Win32,而Win32无法重定向。如果尝试重定向标准输出(例如,重定向到管道或文件),则WriteConsole
将失败,并出现错误\u无效\u句柄
,如下所示:
ReadConsole
和WriteConsole
只能与控制台手柄一起使用ReadFile
和WriteFile
可以与其他句柄(如文件或管道)一起使用<如果与已重定向且不再是控制台句柄的标准句柄一起使用,则代码>读控制台和写控制台
将失败
与rkhb的评论一样,除了文档中的内容外,这也暗示了解决方案。要支持重定向,您需要将dumpregs
的实现更改为call,而不是WriteConsole
。这是一个更通用的函数,可以写入任何类型的句柄,包括标准控制台输出(laWriteConsole
)或您可能将输出重定向到的任何其他类型的对象。完成此更改后,您当然需要重建Irvine32库
WriteFile
的唯一显著限制是它不支持像writeconole
那样的Unicode输出,但在您的情况下这不是问题。dumpregs
的输出都是ANSI。@hatchet谢谢您的评论。我的问题不是如何使用C#运行exe文件,我已经有了这方面的代码。我的问题是输出总是空的string@hatchet它们对我都不起作用。输出总是空的。你确定输出是标准输出而不是标准错误吗?Irvine的库可以工作,不能重定向。您必须在Irvine32.asm
中将其更改为,将其组装并与floatio.obj
一起构建一个新库。其他注释是正确的。问题不在你的c代码中。如果该程序(调用dumpregs)正常地写入了stdout,那么您的代码就会按原样捕获它。我做了一个快速测试来验证这一点。你完全正确!。我使用WriteFile程序在控制台屏幕上打印。现在,我可以使用C代码捕获输出。非常感谢,先生@谢谢你,先生!
INCLUDE Irvine32.inc
.data
.code
main proc
call dumpregs
exit
main ENDP
end main