Windows进程的创建与销毁
### Windows进程的创建与销毁 #### 一、进程的基本概念 在深入了解Windows进程的创建与销毁之前,我们首先需要理解什么是进程以及它在操作系统中的作用。简单来说,进程是正在运行的一个程序实例,每个进程都有自己的内存空间和系统资源。在Windows系统中,进程的管理和控制主要依赖于内核提供的各种服务。 #### 二、进程的创建 在Windows系统中,创建一个新的进程通常涉及到`CreateProcess`函数的使用。该函数允许开发者指定要执行的应用程序路径、命令行参数等信息,并返回进程的信息。 ```cpp // 示例代码:创建一个新的进程 void CreateProgress() { char szCommandLine[] = "cmd"; STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW; // 设置启动窗口显示方式 si.wShowWindow = TRUE; // 默认为TRUE则显示窗口 BOOL bRet = ::CreateProcess( NULL, // 应用程序路径,如果为NULL则使用szCommandLine中的完整路径 szCommandLine, // 命令行参数 NULL, // 进程安全属性 NULL, // 线程安全属性 FALSE, // 继承句柄标志 CREATE_NEW_CONSOLE, // 创建新控制台 NULL, // 新环境变量 NULL, // 新工作目录 &si, &pi); // 进程信息结构体 if (bRet) { // 成功创建后关闭句柄并输出进程ID和线程ID ::CloseHandle(pi.hThread); ::CloseHandle(pi.hProcess); printf("进程ID:%d\n", pi.dwProcessId); printf("线程ID:%d\n", pi.dwThreadId); } } ``` #### 三、进程的销毁 进程的销毁通常指的是终止一个已经存在的进程。在Windows中,可以通过`TerminateProcess`函数来实现这一操作。该函数接收一个指向进程的句柄和一个退出代码作为参数。 ```cpp // 示例代码:根据进程ID终止进程 BOOL TerminateProcessFromId(DWORD dwId) { BOOL bRet = FALSE; HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId); if (hProcess != NULL) { bRet = ::TerminateProcess(hProcess, 0); } CloseHandle(hProcess); return bRet; } void TerminateProcessFromId1() { DWORD dwId; printf("请输入要终止的进程ID:\n"); scanf("%u", &dwId); if (TerminateProcessFromId(dwId)) { printf("终止成功\n"); } else { printf("终止失败\n"); } } ``` #### 四、挂起和激活主线程 除了创建和销毁进程之外,还需要了解如何控制进程中的线程行为,例如挂起和激活主线程。这可以通过`SuspendThread`和`ResumeThread`两个函数来实现。 - `SuspendThread`: 挂起一个线程。 - `ResumeThread`: 恢复一个线程。 这些函数通常用于调试目的或需要暂停线程执行的特殊场景。 #### 五、查看系统进程列表 为了更好地理解和监控进程的行为,可以利用Windows自带的工具(如任务管理器)来查看当前系统中运行的所有进程。此外,也可以编写程序来获取进程列表,例如使用`CreateToolhelp32Snapshot`函数结合`Process32First`和`Process32Next`来遍历所有进程。 ```cpp // 示例代码:查找并打印所有进程信息 int find() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot失败\n"); return -1; } BOOL bMore = ::Process32First(hProcessSnap, &pe32); while (bMore) { printf("进程名:%s\n", pe32.szExeFile); printf("ID:%u\n\n", pe32.th32ProcessID); bMore = ::Process32Next(hProcessSnap, &pe32); } ::CloseHandle(hProcessSnap); } ``` 通过上述代码示例,我们可以看到如何使用Windows API来创建、销毁进程,以及如何控制线程的状态。这些技术对于开发复杂的多进程或多线程应用程序至关重要。同时,掌握这些API的使用方法也有助于提高对Windows操作系统内部机制的理解。
//
#include <iostream.h>
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h> // 声明快照函数的头文件
#include <stdio.h>
int find(){
PROCESSENTRY32 pe32;
// 在使用这个结构之前,先设置它的大小
pe32.dwSize = sizeof(pe32);
// 给系统内的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! \n");
return -1;
}
// 遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{
printf(" 进程名称:%s \n", pe32.szExeFile);
printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap, &pe32);
}
// 不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
}
///////////////////////////////////////////////////////////////
// 02ExitThread.cpp文件
class CMyClass
{
public:
CMyClass() { printf(" Constructor\n"); }
~CMyClass() { printf(" Destructor\n"); }
};
///////////////////////////////////////////////////////////////
// 02TerminateProcess.cpp文件
BOOL TerminateProcessFromId(DWORD dwId)
{
BOOL bRet = FALSE;
// 打开目标进程,取得进程句柄
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
if(hProcess != NULL)
{
// 终止进程
bRet = ::TerminateProcess(hProcess, 0);
}
CloseHandle(hProcess);
return bRet;
}
剩余10页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- apache-maven-3.6.1-bin.zip
- c593f5fc-d4a7-4b43-8ab2-51afc90f3f62
- IIR滤波器参数计算函数
- WPF树菜单拖拽功能,下级目录拖到上级目录,上级目录拖到下级目录.zip
- CDH6.3.2版本hive2.1.1修复HIVE-14706后的jar包
- 鸿蒙项目实战-天气项目(当前城市天气、温度、湿度,24h天气,未来七天天气预报,生活指数,城市选择等)
- Linux环境下oracle数据库服务器配置中文最新版本
- Linux操作系统中Oracle11g数据库安装步骤详细图解中文最新版本
- SMA中心接触件插合力量(插入力及分离力)仿真
- 变色龙记事本,有NPP功能,JSONview功能
- 1
- 2
- 3
前往页