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。 –