我是一个SupportApp.EXE,如果我从Windows CMD提示手动启动,就像这样::
SupportApp.EXE -t 100 > AFile.csv
完美无缺的工作它会为我生成一个CSV文件。
现在我想在VC ++代码中自动化相同的东西。 所以,我为此使用CreateProcess()API。 下面的代码片段::
TCHAR launcher[512];
_tgetcwd(launcher, _MAX_PATH);
TCHAR workDir[512];
_tgetcwd(workDir, _MAX_PATH);
_tcscat(launcher, "\\App\\SupportApp.exe");
TCHAR cmdlineoption[512];
_tcscpy(cmdlineoption, " -t 120 > AFile.csv");
LPTSTR appPath = (LPTSTR)cmdlineoption;
STARTUPINFO sInfo;
memset(&sInfo, 0, sizeof(sInfo));
sInfo.cb = sizeof(sInfo);
sInfo.dwFlags = STARTF_USESHOWWINDOW;
sInfo.wShowWindow = SW_SHOWMAXIMIZED;
PROCESS_INFORMATION pInfo;
memset(&pInfo, 0, sizeof(pInfo));
if (!CreateProcess(launcher, appPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, workDir, &sInfo, &pInfo))
{
... // log error
}
// success
我看到CreateProcess()API成功了,而且我看到我给出的-t 120选项也是由#34; SupportApp.exe" 但是文件重定向操作符">"不能使用CreateProcess()API。
而是将输出定向到CMD本身。但我希望将输出发送到CSV文件。
任何人都可以帮助我如何重定向我的输出 " SupportApp.exe"从我的内部使用CreateProcess()API到一个文件 VC ++代码?
更新2:
审稿人提供的意见包含在此&修改后的代码片段位于STARTUPINFO结构中的文件hnadle,如下所示::
文件已创建,但文件为空&它没有来自createProcess()的任何内容?
TCHAR launcher[512];
_tgetcwd(launcher, _MAX_PATH);
TCHAR workDir[512];
_tgetcwd(workDir, _MAX_PATH);
_tcscat(launcher, "\\App\\SupportApp.exe");
TCHAR cmdlineoption[512];
_tcscpy(cmdlineoption, " -t 120 > AFile.csv");
LPTSTR appPath = (LPTSTR)cmdlineoption;
STARTUPINFO sInfo;
memset(&sInfo, 0, sizeof(sInfo));
sInfo.cb = sizeof(sInfo);
sInfo.dwFlags |= STARTF_USESTDHANDLES; //newly added
sInfo.wShowWindow = SW_SHOWMAXIMIZED;
PROCESS_INFORMATION pInfo;
memset(&pInfo, 0, sizeof(pInfo));
sInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
sInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa, sizeof(sa));
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
HANDLE hn;
if(INVALID_HANDLE_VALUE!=(hn = CreateFile(L" DoneDone.csv",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE,& sa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0))) { sInfo.hStdOutput = = hn; } if(!CreateProcess(launcher,appPath,NULL,NULL,FALSE,0,NULL,workDir,& sInfo,& pInfo)) { ... //日志错误 } //成功
答案 0 :(得分:3)
输出重定向是一个shell特性,即shell在启动子节点之前设置它。
您没有使用shell,而是直接向内核请求启动进程,因此您无法获得该服务。
您需要自己设置所需的重定向。这是在STARTUPINFO
hStdOutput
成员中完成的。当然,请参阅the documentation。
答案 1 :(得分:3)
那是因为重定向操作(以及管道操作)是命令提示程序的一部分,而不是CreateProcess
调用的一部分。
但是,您可以完成命令提示程序在重定向时所执行的操作,并在STARTUPINFO
结构中设置文件句柄。