可能有Win32应用程序阻止,直到它退出?

时间:2014-09-21 16:08:53

标签: c++ visual-studio-2010 winapi

当我在Windows中打开一个命令行(cmd)并启动一个程序,例如calc时,提示会立即返回并启动程序(显示计算器窗口)。

这与我从Linux世界所知的方式相反:当我启动一个(可能是GUI)应用程序时,在我退出已启动的程序之前,提示不会返回。

Example: calculator is still running, but the user can already enter new commands at the prompt

使用w32 api,是否可以对其进行编程以便我的应用程序显示一个窗口,但只有在用户关闭窗口后才会返回提示?

2 个答案:

答案 0 :(得分:3)

  

在退出之前可能有Win32应用程序阻塞吗?

致电CreateProcess以创建流程。这将生成返回的PROCESSINFORMATION结构中的进程句柄。将该流程句柄传递给WaitForSingleObject,等待流程发出信号。


根据评论,您真正想要的是一个可执行文件,当其父进程是控制台应用程序时,它将像控制台应用程序一样运行。并且表现得像GUI应用程序。从单个可执行文件中无法同时执行这两项操作。目标子系统由可执行文件中的元数据确定。

处理此问题的标准方法是拥有两个可执行文件,每个可执行文件都针对不同的子系统。一个控制台应用程序,另一个GUI应用程序。常见的例子是java.exe和javaw.exe,python.exe和pythonw.exe。

答案 1 :(得分:2)

  

使用w32 api,是否可以对其进行编程以便我的应用程序显示一个窗口,但只有在用户关闭窗口后才会返回提示?

我认为这里有几个问题。

首先,如何在Windows中创建流程?要创建进程Windows,请使用CreateProcess

其次,CreateProcess如何运作? CreateProcess显然会创建一个新流程(如calc.exe),它提供了很多创建流程的选项。它还会返回BOOL,以通知您呼叫是否失败或成功。

如果呼叫失败,您会立即收到失败。这是一个“同步”失败,你可以继续在你的程序中继续前进。

如果调用成功,您的进程将与子进程“分离”。它更像是对函数的“异步”调用。您可以与子进程同步,并且可以通过等待PROCESS_INFORMATION结构的hProcess成员来了解它已退出。

第三,并非每个人都从命令行启动进程。可以通过在桌面上单击它来启动它。这在Linux / X11(等)世界也是如此。

第四,从Windows命令行,我相信您可以将CALL用于其他批处理文件。但我不记得它是否也适用于节目。