如何从C程序(使用winapi)调用可执行文件?

如何从C程序(使用winapi)调用可执行文件?,c,windows,winapi,process,C,Windows,Winapi,Process,在谷歌上搜索了几次…… 可以认为这是最安全、最有效的方法吗? 如果是,我想使用被调用进程的输出。 在继续C程序之前,我如何知道它已完成 谢谢。取决于你如何衡量效率。编程效率高 另请参阅及其许多兄弟。CreateProcess()是用于生成子流程的相当低级的函数,可能不是最方便的选项。对于需要读取输出的C程序,请考虑(注意MS CRT在其名称之前放置下划线): 可以用来创建一个进程,这是传递参数更方便的方法 但是如果您想使用流程的输出,那么CreateProcess可能是您最好的选择 使用Crea

在谷歌上搜索了几次……
可以认为这是最安全、最有效的方法吗?
如果是,我想使用被调用进程的输出。
在继续C程序之前,我如何知道它已完成


谢谢。

取决于你如何衡量效率。编程效率高

另请参阅及其许多兄弟。

CreateProcess()
是用于生成子流程的相当低级的函数,可能不是最方便的选项。对于需要读取输出的C程序,请考虑(注意MS CRT在其名称之前放置下划线):

可以用来创建一个进程,这是传递参数更方便的方法

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

使用
CreateProcess
可以传递一个结构,该结构可用于将文件管道句柄传递到进程外的标准文件


CreateProcess
将返回一个包含已创建进程句柄的结构。该句柄将在进程退出时发出信号

因此,您可以在进程句柄上等待输出完成


完成后,不要忘记关闭进程句柄和线程句柄。

如何执行Windows程序并捕获其输出的经典源代码是-它实际上没有看上去那么复杂。

如果您需要完全控制(更改std in/out等),CreateProcess是您最好的选择。如果您正在执行用户指定的某些操作,则确实需要使用ShellExecute[Ex],因为对于需要UAC提升的应用程序,CreateProcess将失败(当您启动应用程序时,ShellExecuteEx还可以为您提供子进程的句柄)

popen()将无法从GUI ap工作,只能从控制台工作。请不要建议(!feof(f)){-它已经被误用得够多了。从MSDN“如果在Windows程序中使用,_popen函数返回一个无效的文件指针,这将导致程序无限期挂起。_popen在控制台应用程序中正常工作。”查看要启动的进程是否需要提升(或Vista/7自动认为它会失败,因为它的文件名或另一个启发式)CreateProcess将失败,您需要处理该特定错误。请参阅。ShellExecute或ShellExecuteEx是最简单的,第二个可以让您获得进程信息,我认为其中包括一个进程句柄,您可以使用John描述的。
FILE *f = _popen("dir", "r");
char buf[1000];
while (fgets(buf, sizeof(buf), f)) {
    // .. process output using stdio functions
}
_pclose(f);