2

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

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

例如(伪)

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

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

4

2 回答 2

5

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

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

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

于 2010-07-28T08:53:23.587 回答
2

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

但是,我建议不要这样做。Windows 上的启动过程可能会很慢,并且会阻塞您的 UI。考虑一个具有 50 毫秒等待超时的 PeekMessage 循环,以便从 Windows 应用程序执行此操作。

于 2010-07-28T08:21:29.053 回答