当我在Windows中打开一个命令行(cmd
)并启动一个程序,例如calc
时,提示会立即返回并启动程序(显示计算器窗口)。
这与我从Linux世界所知的方式相反:当我启动一个(可能是GUI)应用程序时,在我退出已启动的程序之前,提示不会返回。
使用w32 api,是否可以对其进行编程以便我的应用程序显示一个窗口,但只有在用户关闭窗口后才会返回提示?
答案 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
用于其他批处理文件。但我不记得它是否也适用于节目。