无法使用创建进程重定向标准输出
Unable to redirect standard output using CreateProcess
我正在维护一个 MFC 程序,并且我正在启动一个简单的 Win32 控制台程序(只是一个"Hello World"程序,源代码如下),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[] = "Testrn";
DWORD written;
if (!WriteFile(hfile, "Testrn", 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");
}
它几乎按预期工作:
- 它打开"输出.txt">
- 它将"Test\r"写入"输出.txt
- 它启动了TestConsole1.exe
- TestConsole1.exe 的控制台窗口不显示"Hello Word",这是预期的,因为标准输出应该重定向到"输出.txt
WaitForSingleObject
等待 TestConsole1.exe 完成CloseHandle
关闭"输出.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;
}
你的hfile
是不可继承的 - 你需要在调用中使用SECURITY_ATTRIBUTES
CreateFile
SECURITY_ATTRIBUTES sa = { sizeof(sa), 0, TRUE };
HANDLE hfile = CreateFile("output.txt", GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
相关文章:
- 使用重定向标准处理子进程中的 kbhit
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 当使用带有stdin和stdout重定向的双进程管道时,如何避免stdin上的重复输入
- 无法使用创建进程重定向标准输出
- 重定向子进程的输出
- 我可以重定向两个子进程的标准输出吗?
- 创建进程和重定向输出
- 进程重定向可以在bash中同步吗
- 重定向由execv运行的进程的输出
- 将一个进程标准输出重定向到管道将产生不同的运行结果
- 使用管道从子进程进行I/O重定向-winapi
- 将 CreateProcess() 的 stdout 重定向到管道并在另一个进程 c++ 窗口中读取它
- 重定向父进程的管道,而不影响子进程
- 文件重定向运算符">"不适用于创建进程() API
- 重定向子进程的输入和输出不起作用
- 将ffmpeg管道重定向到子进程
- 子进程的异步双向IO重定向
- Python将输入重定向到子进程
- 仅重定向子进程stdin,并从stdout和stderr中删除数据
- 使用重定向输入和输出的c++进程间通信不适用于发布版本