我有一个 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,而是直接进入内核要求它启动一个进程,因此您不会获得该服务。
您需要自己设置所需的重定向。这是在 STARTUPINFO
的 hStdOutput
成员中完成的。参见 the documentation ,当然。
关于c++ - 文件重定向运算符 ">"不适用于 CreateProcess() API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27375890/