[英]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.