首先,我对C ++很陌生。
我想要完成以下任务:
到目前为止,我有以下内容:
SHELLEXECUTEINFO lpExecInfo;
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
lpExecInfo.lpFile = L"SampleApp.exe";
lpExecInfo.fMask = SEE_MASK_DOENVSUBST|SEE_MASK_NOCLOSEPROCESS;
lpExecInfo.hwnd = NULL;
lpExecInfo.lpVerb = L"open";
lpExecInfo.lpParameters = L"-cf test.xml";
lpExecInfo.lpDirectory = NULL;
lpExecInfo.nShow = SW_HIDE; // hide shell during execution
lpExecInfo.hInstApp = (HINSTANCE) SE_ERR_DDEFAIL;
ShellExecuteEx(&lpExecInfo);
// wait until the process is finished
if (lpExecInfo.hProcess != NULL)
{
::WaitForSingleObject(lpExecInfo.hProcess, INFINITE);
::CloseHandle(lpExecInfo.hProcess);
}
上面的代码实现了除管道输出到文件之外的所有内容。 但是,我似乎无法使用ShellExecute。 似乎我需要使用CreateProcess。 我希望有更多C ++经验的人能够为我提供我的代码和管道输出的CreateProcess等价物。如果没有,至少确认我想要做的事情是可能的,并指出我正确的方向。
- 谢谢
答案 0 :(得分:4)
除非您感觉特别自虐或真正需要优化此操作,否则请使用_popen
创建子进程。这将返回FILE *
,您可以从中读取孩子的输出。从那里读取,写入文件,完成。
FILE *child = _popen("child.exe", "r");
FILE *result = fopen("result.txt", "w");
// error checking omitted.
char buffer[1024];
while (fgets(buffer, sizeof(buffer), child))
fputs(buffer, result);
自己这样做(使用Windows API)当然是可能的,甚至可以减少开销,但是非常更多的工作。
答案 1 :(得分:1)
您想要熟悉this code,因为它正是您想要做的事情。
您需要在ReadFromPipe
函数中向write to file添加一些代码。