2012-12-04 205 views
2

首先,我对C++很陌生。C++运行可执行文件和管道输出到文件

我想完成以下任务:

  • 执行以下命令:“SampleApp.exe -cf的test.xml”
  • 我需要在隐藏模式下执行
  • 我需要的外壳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等价物。如果没有,至少要确认我想做的事情是可能的,并指出我的方向是正确的。

- 感谢

+0

互联网上有多个例子(包括本站),它展示了如何使用'CreateProcess'来创建子进程,其中父进程从子进程捕获输出。 –

+0

是的,我知道,但似乎CreateProcess比ShellExecute要复杂得多,我发现的例子也有不同程度的复杂性。我希望根据自己的需求或甚至一些很好的示例代码得到一些建议,以完成我需要的或我需要的一些内容。 –

回答

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)当然是可能的,甚至可以减少开销,但它是大大更多的工作。