2017-04-07 76 views
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; 
} 

回答

5

hfile是不可繼承 - 你需要使用SECURITY_ATTRIBUTES致電CreateFile

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

感覺很愚蠢。它甚至寫在文檔中。但這是我第一次不得不處理安全描述符,直到現在我總是把它們設置爲NULL。 –