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

Mr.*_*Boy 2 winapi spawning visual-c++

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

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

例如(伪)

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

是否有一个 Win32 API 调用将运行该进程并等待它结束?我查看了 CreateProcess 但它在尝试启动时立即返回,我查看了 ShellExecute 但这似乎有点难看,即使它同步的。

Bob*_*ore 5

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

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

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