2

首先,我对 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。如果不是,至少确认我想做的事情是可能的,并为我指明正确的方向。

- 谢谢

4

2 回答 2

4

除非您感觉特别受虐或确实需要优化此操作,否则请使用_popen创建子进程。这将返回 a 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)当然是可能的,甚至可以减少开销,但它的工作量要大得多。

于 2012-12-04T17:06:33.223 回答
1

你会想要熟悉这段代码,因为这正是你想要做的。您将需要添加一些代码以写入ReadFromPipe函数中的文件。

于 2012-12-04T15:17:24.613 回答