文件重定向运算符">"不适用于创建进程() API
File re-direction operator ">" doesn't work with CreateProcess() API
>我有一个支持应用程序.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,而是直接进入内核,要求它启动一个进程,所以你没有得到该服务。
您需要自己设置所需的重定向。这是在STARTUPINFO
的hStdOutput
成员中完成的。当然,请参阅文档。
这是因为重定向操作(以及管道操作(是命令提示符程序的一部分,而不是CreateProcess
调用的一部分。
但是,您可以完全执行命令提示符程序在执行重定向时执行的操作,并在STARTUPINFO
结构中设置文件句柄。
- WMI检测进程创建事件-c++
- C++ 无法识别创建进程'telnet'
- 避免使用 boost::进程间::消息队列创建文件
- 从根权限进程创建可访问的文件
- gcc 找不到 -lgcc, g++.exe: 错误: 创建进程: 没有这样的文件或目录
- 如何在进程之间创建双向通道?
- 创建进程 API 失败,在窗口 122 上出现错误代码 10
- 有没有办法为使用 Boost 生成的进程创建新的控制台窗口
- 如何在 Python 进程中访问由C++进程创建的互斥锁
- 是否有可能以及如何使用log4cxx库每个进程创建独立的记录仪
- 从创建进程创建的进程获取输出
- C++:监视 Windows 中的进程创建和终止
- 子进程如何告诉其父进程创建新的子进程
- 从“cmd”文件启动的进程创建进程
- 仅使用本地c++操作为多个进程创建共享内存
- 在OSX中使用C / c++获取进程创建日期时间
- Windows父进程和子进程创建
- 使用CreateProcessAsUser函数从提升进程创建非提升进程
- 为运行在非admin用户帐户中的进程创建防火墙规则
- 如何跟踪进程创建的ActiveX控件?