c++ - 文件重定向运算符 ">"不适用于 CreateProcess() API

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

我有一个 SupportApp.EXE,如果我像这样从 Windows CMD prommpt 手动启动::

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 选项也被这个“SupportApp.exe”采用 但是文件重定向运算符“>”不适用于 CreateProcess() API。

相反,输出被定向到 CMD 本身。但我希望将输出发送到 CSV 文件。

Can anyone please help me in how do I redirect the output of my "SupportApp.exe" to a file using CreateProcess() API from within my VC++ code ?

更新 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;

处理 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)) { ...//记录错误 } //成功

最佳答案

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

您没有使用 shell,而是直接进入内核要求它启动一个进程,因此您不会获得该服务。

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

关于c++ - 文件重定向运算符 ">"不适用于 CreateProcess() API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27375890/

相关文章:

c++ - 使用多个 "." boost 文件扩展名

c++ - g++4.4 c++98 目标文件是否与 g++4.8 c++11 兼容?

c - 当 `addrinfo::ai_addrlen` 大于 `sizeof(struct sockaddr)` 时该怎么办?

c - 为什么 GCC 内联汇编器需要破坏信息,而 MSVC 不需要

visual-c++ - 如何解决Visual Studio(LNK2005)中的此链接错误?

c++ - xutility 文件?

c++ - 使用 gcc 编译时覆盖系统头文件

c++ - 一个类对象可以容纳多大的属性?如何确定堆栈/堆限制?

c - 用户选择他想要进行的操作

c - 使用 qsort 对字符串进行排序以检查它们是否是 Anagram