进程有启动就有终止,通过CreateProcess函数可以启动一个新的子进程,但是如何终结子进程呢?主要有四种方法:
通过主线程的入口函数(main函数、WinMain函数)的return关键字终止进程
一个应用程序只有一个入口函数,对于控制台来说是main函数,对于GUI程序来说这个入口函数一般是WinMain。入口函数通过return关键字返回或者程序自上而下执行完成之后,进程可以自动终止,进程相关的所有资源都会被操作清理。这也是开发中最常用的进程终止方法,也是强烈推荐大家使用的终止进程的方式。
那么如何能获取到子进程的返回值呢,以下面代码为例,这是一个最简单的控制台程序,它返回-3。- #include <iostream>
- #include <Windows.h>
- int main()
- {
- return -3;
- }
复制代码 首先演示在cmd控制台或者bat脚本中如何获取该进程的最终返回值:通过echo %errorlevel%命令可以获取到上一个cmd命令的返回值。如下:
在程序中获取子进程的返回值,CreateProcess函数创建子进程成功之后,主进程可以拿到子进程的句柄。通过调用GetExitCodeProcess函数可以获取到某个进程的返回值,函数原型如下:- BOOL GetExitCodeProcess(
- HANDLE hProcess,//子进程句柄
- LPDWORD lpExitCode//用于接受子进程的返回值
- );
复制代码 请看以下代码:
[code]#include #include int main(){ //即将启动的exe程序路径 LPCWSTR lpApplicationName = L"D:\\project\\ConsoleApp1\\x64\\Debug\\NewApp.exe"; // 定义启动信息和进程信息结构 STARTUPINFOW si; PROCESS_INFORMATION pi; // 初始化启动信息结构 ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); BOOL ret = CreateProcess(lpApplicationName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); // 等待进程结束 WaitForSingleObject(pi.hProcess, INFINITE); // 获取子进程的返回值 DWORD exitCode; GetExitCodeProcess(pi.hProcess, &exitCode); // 将无符号整数转换为有符号整数 int signedExitCode = static_cast(exitCode); std::cout |