我尝试使用CreateProcess来运行像hg > test.txt
这样的简单命令。我尝试将字符串作为一个整体运行(而不是将其分成应用程序名称及其参数)。为什么CreateProcess(0, "notepad.exe test.txt", ...)
有效但CreateProcess(0, "hg > test.txt", ...)
没有?
答案 0 :(得分:23)
您不能在传递给CreateProcess
的命令行中使用stdout重定向。要重定向stdout,您需要为STARTUPINFO
结构中的输出指定文件句柄。
你也犯了另一个更微妙的错误。第二个参数lpCommandLine
必须指向可写内存,因为CreateProcess
会覆盖缓冲区。如果你碰巧使用的是该函数的ANSI版本,那么你将会使用它,但不能用于Unicode版本。
此函数的Unicode版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。如果此参数是常量字符串,则该函数可能会导致访问冲突。
答案 1 :(得分:22)
下面的代码创建了一个无控制台的进程,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;
}
答案 2 :(得分:8)
Microsoft有一个示例如何重定向标准输出: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx
答案 3 :(得分:7)
CreateProcess()启动进程,它不是命令行itnerpreter。它不知道“&gt;”是和不会为你做流重定向。您需要自己打开文件test.txt并将其传递给STARTUPINFO结构中的CreateProcess: CreateProcess STARTUPINFO
答案 4 :(得分:-1)
您应该使用params“/ c命令行”运行进程cmd.exe。 这会将输出重定向到文件或通过CreateProcess组织管道。