【问题标题】:Unable to redirect standard output using CreateProcess无法使用 CreateProcess 重定向标准输出
【发布时间】:2017-09-02 15:39:25
【问题描述】:

我正在维护一个 MFC 程序,我正在使用 CreateProcess 启动一个简单的 Win32 控制台程序(只是一个“Hello World”程序,源代码如下),我无法将该程序的标准输出重定向到一个文件。

这是启动代码,不要理会Fatal函数,它只是 显示一条消息并中止程序,这只是测试代码。

  HANDLE hfile = CreateFile("output.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  if (hfile == INVALID_HANDLE_VALUE)
  {
    Fatal("Fatal error: CreateFile");
  }

  static const char TestText[] = "Test\r\n";
  DWORD written;
  if (!WriteFile(hfile, "Test\r\n", sizeof(TestText) - 1, &written, NULL))
  {
    Fatal("Fatal error: CreateProcess");
  }

  STARTUPINFO startupinfo = {0};
  startupinfo.cb = sizeof(STARTUPINFO);
  startupinfo.lpTitle = "Some Title";
  startupinfo.dwFlags = STARTF_USESTDHANDLES;
  startupinfo.hStdOutput = hfile; 

  PROCESS_INFORMATION processInfo;

  if (!CreateProcess("S:\\Git\\TestRedirect\\TestConsole1\\Debug\\TestConsole1.exe", "cmdline", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupinfo, &processInfo))
  {
    Fatal("Fatal error: CreateProcess");
  }

  if (WaitForSingleObject(processInfo.hProcess, 10000) != WAIT_OBJECT_0)
  {
    Fatal("Fatal error: WaitForSingleObject");
  }

  if (!CloseHandle(hfile))
  {
    Fatal("Fatal error: CloseHandle");
  }

它几乎可以按预期工作:

  • 它会打开“output.txt”
  • 它将“Test\r\n”写入“output.txt”
  • 它会启动 TestConsole1.exe
  • TestConsole1.exe 的控制台窗口不显示“Hello Word”,这是意料之中的,因为标准输出应该被重定向到“output.txt”
  • WaitForSingleObject 等待 TestConsole1.exe 完成
  • CloseHandle 关闭“output.txt”

现在我希望“output.txt”包含以下内容:

测试
世界你好!

但实际上它的内容是

测试


TestConsole1.exe源码:

#include <stdio.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    Sleep(2000);    // wait 2 seconds so I can see what happens
    return 0;
}

【问题讨论】:

    标签: c++ c winapi mfc


    【解决方案1】:

    您的 hfile 不可继承 - 您需要在调用 CreateFile 时使用 SECURITY_ATTRIBUTES

    SECURITY_ATTRIBUTES sa = { sizeof(sa), 0, TRUE };
    HANDLE hfile = CreateFile("output.txt", GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    

    【讨论】:

    • 感觉好蠢。它甚至在文档中都写得很清楚。但这是我第一次处理安全描述符,直到现在我总是将它们设置为 NULL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多