文件重定向运算符">"不适用于创建进程() API

File re-direction operator ">" doesn't work with CreateProcess() API

本文关键字:进程 创建 适用于 API 运算符 重定向 gt 文件 不适用      更新时间:2023-10-16

>我有一个支持应用程序.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 选项也被这个"支持应用程序.exe"但是文件重定向运算符">"不适用于CreateProcess(( API。

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

任何人都可以帮助我如何重定向我的输出 "支持应用程序.exe"到我的 VC++ 代码 ?

更新 2:

审阅者给出的输入合并在此内容中,修改后的代码片段如下,该代码片段将文件hnadel置于STARTUPINFO结构中,如下所示:

文件

正在创建,但文件为空,并且没有任何来自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;} 如果(!CreateProcess(launcher, appPath, NULL, NULL, FALSE, 0, NULL, workDir, &sInfo, &pInfo(( { ...//日志错误 } 成功

输出重定向是一个 shell 功能,即 shell 在启动子项之前设置它。

你没有使用 shell,而是直接进入内核,要求它启动一个进程,所以你没有得到该服务。

您需要自己设置所需的重定向。这是在STARTUPINFOhStdOutput成员中完成的。当然,请参阅文档。

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

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