C ++运行可执行文件和管道输出到文件

时间:2012-12-04 15:10:51

标签: c++ mfc

首先,我对C ++很陌生。

我想要完成以下任务:

  • 执行以下操作:“SampleApp.exe -cf test.xml”
  • 我需要以隐藏模式执行的shell
  • 我需要C ++应用程序等待SampleApp完成
  • 如果SampleApp花费的时间超过X,那么我需要终止该过程
  • 我想将SampleApp的输出传递给文件(sample.log)

到目前为止,我有以下内容:

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等价物。如果没有,至少确认我想要做的事情是可能的,并指出我正确的方向。

- 谢谢

2 个答案:

答案 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添加一些代码。