从Win32应用程序作为同步操作运行进程

时间:2010-07-28 08:15:37

标签: visual-c++ winapi spawning

我有一个现有的实用程序,我们称之为util.exe。它是一个命令行工具,它从命令行获取输入,并在磁盘上创建一个文件,比如一个图像文件

我想通过运行util.exe在另一个应用程序中使用它。但是它需要是同步的,因此在处理继续时已知文件存在。

例如(psudeo)

bool CreateImageFile(params)
{
  //ret is util.exe program exit code
  int ret = runprocess("util.exe",params);
  return ret==0;
}

是否有一个Win32 API调用将运行该进程并等到它结束?我查看了CreateProcess,但是一旦它尝试启动它就会返回,我看着ShellExecute,但即使同步,这看起来有点难看。

2 个答案:

答案 0 :(得分:4)

没有单一的api,但这对Win32应用来说实际上是一个更有趣的一般问题。您可以在进程句柄上使用CreateProcess或ShellExecuteEx和WaitForSingleObject。此时的GetExitCodeProcess将为您提供程序的退出代码。有关简单示例代码,请参阅here

然而,这会完全阻止您的主线程,并且在某些Win32消息传递方案下可能会给您带来严重的死锁问题。假设生成的exe执行广播sendmessage。在所有窗口处理完邮件之后才能继续执行 - 但是由于您被阻止等待它,您无法继续操作。僵局。由于您使用的是纯粹的命令行程序,因此这个问题可能不适用于您。您是否关心命令行程序是否会挂起一段时间?

普通应用程序的最佳通用解决方案可能是将进程启动和等待分离到一个线程上,并在线程运行完成时将消息发送回主窗口。收到消息后,您知道继续安全,并且没有死锁问题。

答案 1 :(得分:2)

流程句柄是一个可等待的对象,AFAIK。这正是您所需要的。

但是,我建议不要做那样的事情。在Windows上启动进程可能会很慢,并且会阻止您的UI。考虑一个具有50ms等待超时的PeekMessage循环来从Windows应用程序执行此操作。