文件重定向运算符“>”不适用于CreateProcess()API

时间:2014-12-09 09:50:41

标签: c++ c visual-c++ file-io createprocess

我是一个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))         {         ... //日志错误         }         //成功

2 个答案:

答案 0 :(得分:3)

输出重定向是一个shell特性,即shell在启动子节点之前设置它。

您没有使用shell,而是直接向内核请求启动进程,因此您无法获得该服务。

您需要自己设置所需的重定向。这是在STARTUPINFO hStdOutput成员中完成的。当然,请参阅the documentation

答案 1 :(得分:3)

那是因为重定向操作(以及管道操作)是命令提示程序的一部分,而不是CreateProcess调用的一部分。

但是,您可以完成命令提示程序在重定向时所执行的操作,并在STARTUPINFO结构中设置文件句柄。