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

Visual c++ 从Win32应用程序将进程作为同步操作运行,visual-c++,winapi,spawning,Visual C++,Winapi,Spawning,我有一个现有的实用程序应用程序,我们称之为util.exe。它是一个命令行工具,从命令行获取输入,并在磁盘上创建一个文件,比如说一个图像文件 我想通过运行util.exe在另一个应用程序中使用它。但是,它需要同步,以便在继续处理时知道文件存在 e、 g(psudeo) 是否有一个Win32 API调用将运行该进程并等待它结束?我查看了CreateProcess,但它尝试启动时会立即返回,我查看了ShellExecute,但这似乎有点难看,即使它是同步的。进程句柄是一个可等待的对象,好吧。这正是你

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

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

e、 g(psudeo)


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

进程句柄是一个可等待的对象,好吧。这正是你需要的


然而,我建议不要做这样的事情。在windows上启动进程可能会很慢,并且会阻塞您的UI。考虑一个具有50ms等待超时的PEEKMENT消息,从Windows应用程序中执行。

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

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


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

您已经通过提到ShellExecute来回答您自己的问题……虽然有点难看,不是吗?另外,我不确定我是否能得到我的程序返回代码,当我尝试它时,我得到了一个随机值42:)还有一个叫做“同步”的东西,它是通过将
\u P\u WAIT
标志作为第一个参数传递给
\u spawn
函数之一来完成的:这让我很困惑。我在网上看到一些地方使用WaitForSingleObject,但页面上说这不再有效;或者这只是说在32位中生成16位的EXE?消息循环有什么帮助?我仍然需要以某种方式生成这个过程?此外,如果整个问题是我的应用程序在生成文件时暂停,那么应该可以阻止?在Windows上创建进程可能会很慢,但可能与进程终止所需的时间不可比。所以这里关键的不是放置CreateProcess()的位置,而是WaitForSingleObject()。不管怎样,您是在编写GUI应用程序还是控制台应用程序?(当然可以阻止一个简单的顺序控制台应用程序)
bool CreateImageFile(params)
{
  //ret is util.exe program exit code
  int ret = runprocess("util.exe",params);
  return ret==0;
}