代码介绍:
下面我将详细解析这个不断弹出终端窗口的 C++ 程序,从代码结构到 Windows API 调用,再到系统底层机制,进行全面深入的剖析。
程序整体功能概述
这个程序的核心功能非常简单:通过无限循环不断创建新的 Windows 命令提示符窗口 (cmd.exe),直到程序被强制终止。它主要演示了如何使用 Windows API 创建新进程并为其分配独立的控制台窗口。
这种技术在实际应用中可能用于:
- 演示进程创建和多窗口管理
- 系统资源压力测试
- 某些自动化脚本执行场景
- 当然也可能被用于恶作剧或破坏性目的(所以使用时需要特别小心)
代码逐行解析
下面我们来逐行分析这个程序:
cpp
运行
#include <windows.h>
#include <iostream>
这两行是头文件包含指令:
<windows.h>
是 Windows API 的核心头文件,包含了大量 Windows 系统编程所需的类型定义、函数声明和宏定义<iostream>
是标准输入输出流头文件,不过在这个程序中并没有实际使用标准输入输出功能,理论上可以移除
cpp
运行
int main() {
// 无限循环创建新的终端窗口
while (true) {
程序入口点main
函数开始,返回值类型为int
,符合 C++ 标准。函数体内部是一个无限循环while(true)
,这意味着程序会持续执行循环体中的代码,直到被外部强制终止(如通过任务管理器结束进程)。
cpp
运行
// 创建一个新的进程,运行cmd.exe
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
这里声明了两个重要的结构体变量:
STARTUPINFO si
:这个结构体包含新进程的窗口如何显示以及标准输入输出的重定向信息等。初始化时设置了结构体的大小sizeof(si)
,这是 Windows API 函数调用的标准做法,确保系统知道我们使用的结构体版本。PROCESS_INFORMATION pi
:这个结构体将接收新创建进程的标识信息,包括进程句柄和主线程句柄。
cpp
运行
// 创建新窗口并执行命令
if (CreateProcess(
"C:\\Windows\\System32\\cmd.exe",
NULL,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi
)) {
这里调用了核心 API 函数CreateProcess
来创建新进程:
- 第一个参数
"C:\\Windows\\System32\\cmd.exe"
:指定要执行的程序路径,这里是 Windows 命令提示符程序 - 第二个参数
NULL
:表示不传递命令行参数给新进程 - 第三个和第四个参数
NULL
:分别表示进程安全属性和线程安全属性,设为NULL
表示使用默认安全描述符 - 第五个参数
FALSE
:表示新进程不继承当前进程的句柄 - 第六个参数
CREATE_NEW_CONSOLE
:这是一个重要的标志,指示为新进程创建一个新的控制台窗口 - 第七个和第八个参数
NULL
:分别表示环境变量和当前目录,设为NULL
表示使用当前进程的环境和目录 - 最后两个参数
&si
和&pi
:分别传递启动信息结构体的地址和接收进程信息的结构体地址
如果CreateProcess
调用成功,函数返回非零值,进入条件语句块。
cpp
运行
// 关闭进程和线程句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
这里调用CloseHandle
函数关闭新进程和主线程的句柄:
- 在 Windows 系统中,句柄 (Handle) 是一种用于标识系统资源的抽象概念
- 进程和线程都是系统资源,创建后会返回对应的句柄
- 不再需要的句柄应该被关闭,以释放系统资源
- 注意这里只是关闭句柄,并不终止进程,