2010-02-15 64 views

回答

2

ShellExecute可用于创建一个进程,它是一个更方便的方式传递参数。

但是,如果你想使用过程中的输出,那么CreateProcess可能是你最好的选择

随着CreateProcess你可以传递一个STARTUPINFO结构,可用于将文件管道句柄传递到标准输出的过程中。

CreateProcess将返回包含HANDLE的PROCESS_INFORMATION结构到创建的进程。该过程将在过程退出时变成信号。

所以你可以在WaitForSingleObject的进程句柄上等待输出完成。

当你完成后,不要忘记CloseHandle上的进程句柄和线程句柄。

+0

如果您要启动的进程需要提升(或Vista/7会自动认为它有,因为它的文件名或其他启发式)CreateProcess将失败,您需要处理该特定的错误。请参阅http://msdn.microsoft.com/en-us/library/bb756945.aspx。 ShellExecute或ShellExecuteEx是最简单的,第二个可以让您获得流程信息,我认为它包含您可以像约翰描述的那样使用流程句柄。 –

1

取决于您如何衡量效率。 system()是程序员高效。

另请参阅exec()及其许多兄弟。

1

CreateProcess()是一个相当低级的产卵子过程函数,可能不是最方便的选择。当您需要读取输出一个C程序,考虑popen()(注意MS CRT它的名字前放置一个下划线):

FILE *f = _popen("dir", "r"); 
char buf[1000]; 
while (fgets(buf, sizeof(buf), f)) { 
    // .. process output using stdio functions 
} 
_pclose(f); 
+0

popen()只能从控制台通过GUI ap工作。而且请不要在(!feof(f)){ - 它被滥用的时候提示。 – 2010-02-15 21:46:59

+0

我改变feof的使用。 –

+0

来自MSDN“如果在Windows程序中使用,_popen函数会返回一个无效的文件指针,导致程序无限期挂起。_popen在控制台应用程序中正常工作。”请参阅http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.71%29.aspx – 2010-02-15 21:51:59

1

如何执行Windows程序并捕获其输出的经典源码是this article on MSDN - 它实际上并不像看起来那么复杂。

1

如果您需要完全控制(更改标准输入/输出等),CreateProcess是您的最佳选择。如果您正在执行用户指定的内容,则确实需要使用ShellExecute [Ex],因为对于需要UAC提升的应用程序,CreateProcess将会失败(当您启动应用程序时,ShellExecuteEx也能够为您提供子进程的句柄)

相关问题