2
我正在维护一个MFC程序,我正在启动一个简单的Win32控制台程序(只是一个“Hello World”程序,源代码如下)CreateProcess
,我无法重定向标准该程序输出到一个文件。无法使用CreateProcess重定向标准输出
这是启动代码,不用担心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的”
- 它写道: “测试\ r \ n” 到 “output.txt的”
- 它启动TestConsole1 .exe
- TestConsole1.exe的控制台窗口不显示“Hello Word”,这是预期的,因为标准输出应该被重定向到“output.txt”
- 个
WaitForSingleObject
等待TestConsole1.exe完成 CloseHandle
关闭 “output.txt的”
现在我希望 “output.txt的” 遏制这样的:
测试
的Hello World!
,但实际上它的内容是
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;
}
感觉很愚蠢。它甚至写在文档中。但这是我第一次不得不处理安全描述符,直到现在我总是把它们设置为NULL。 –