簡體   English   中英

如何使用 CreateProcess 將 output 重定向到文件?

[英]How do I redirect output to a file with CreateProcess?

我嘗試使用 CreateProcess 運行一個簡單的命令,例如hg > test.txt 我嘗試將字符串作為一個整體運行(而不是將其分成應用程序名稱及其參數)。 為什么CreateProcess(0, "notepad.exe test.txt", ...)有效,但CreateProcess(0, "hg > test.txt", ...)無效?

下面的代碼創建了一個無控制台進程,其中 stdout 和 stderr 重定向到指定的文件。

#include <windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;       

    HANDLE h = CreateFile(_T("out.log"),
        FILE_APPEND_DATA,
        FILE_SHARE_WRITE | FILE_SHARE_READ,
        &sa,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL );

    PROCESS_INFORMATION pi; 
    STARTUPINFO si;
    BOOL ret = FALSE; 
    DWORD flags = CREATE_NO_WINDOW;

    ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
    ZeroMemory( &si, sizeof(STARTUPINFO) );
    si.cb = sizeof(STARTUPINFO); 
    si.dwFlags |= STARTF_USESTDHANDLES;
    si.hStdInput = NULL;
    si.hStdError = h;
    si.hStdOutput = h;

    TCHAR cmd[]= TEXT("Test.exe 30");
    ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);

    if ( ret ) 
    {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
        return 0;
    }

    return -1;
}

您不能在傳遞給CreateProcess的命令行中使用標准輸出重定向。 要重定向標准輸出,您需要在STARTUPINFO結構中為 output 指定文件句柄。

你也在犯另一個更微妙的錯誤。 第二個參數lpCommandLine必須指向可寫 memory 因為CreateProcess會覆蓋緩沖區。 如果您碰巧使用的是 function 的 ANSI 版本,那么您將僥幸成功,但對於 Unicode 版本則不行。

Unicode這個function的版本, CreateProcessW ,可以修改這個字符串的內容。 因此,此參數不能是指向只讀 memory 的指針(例如const變量或文字字符串)。 如果此參數為常量字符串,則 function 可能會導致訪問沖突。

Microsoft 有一個示例如何重定向標准 output: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx

CreateProcess() 啟動進程,它不是命令行 itnerpreter。 它不知道“>”是什么,也不會為您執行 stream 重定向。 您需要自己打開文件 test.txt 並將其句柄傳遞給 STARTUPINFO 結構內的 CreateProcess: CreateProcess STARTUPINFO

您應該使用參數“/c 命令行”運行進程 cmd.exe。 這會將 output 重定向到文件或通過 CreateProcess 組織管道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM