进程相关操作

函数功能
CreateProcess 创建进程
OpenProcess 打开进程
ExitProcess 退出本进程
TerminateProcess 结束指定进程
WinExec 启动一个进程
ShellExecute 运行一个外部程序,或者打开一个文件目录,文件夹等等
system 控制台命令
CreateToolhelp32Snapshot 创建快照遍历进程、线程、模块、堆

打开一个进程(其实也就是获得进程句柄

函数原型

HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);

参数

第一个参数dwDesiredAccess表示打开的进程的权限,来描述打开这个进程的句柄获得的权限有哪些

PROCESS_ALL_ACCESS 这个宏表示获得所有的权限

 

第二个参数 bInheritHandle表示如果用这个句柄创建的进程是否继承该句柄,在这里我们拿来也没啥用直接用NULL就好

第三个参数表示要打开的进程的ID

void Open_Process(int pid)
{
OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
}

返回值

如果打开成功会返回对于的进程句柄,如果失败则返回NULL

关闭指定进程

函数原型

BOOL TerminateProcess(
HANDLE hProcess,
UINT   uExitCode
);

参数

第一个参数表示进程句柄

第二个参数表示的是退出进程传递的代码值,这个基本上是写操作系统时的进程退出的原因才用的上,这里直接传0就好

void Close_Process(HANDLE hProcess)
{
TerminateProcess(hProcess, 0);
}

遍历进程

函数原型

HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);

这个函数是包括在tlhelp32.h头文件下的,需要添加使用

参数

第一个参数 dwFlags表示需要遍历什么东西。因为它可以遍历进程线程模块和堆这四种东西。

TH32CS_SNAPPROCESS 这个宏表示的是遍历系统中的所有进程

第二个参数 表示的是进程的ID,但是这个第二个参数只有在遍历线程,模块和堆的情况下需要,因为线程模块和堆都是进程里面包含的,因为这里我们是需要的是遍历进程,所以直接传0

返回值

如果函数成功,返回打开的句柄到指定的快照,如果失败则返回INVALID_HANDLE_VALUE

枚举进程

在CreateToolhelp32Snapshot函数中的第一个参数的宏中提示了枚举进程的办法,使用Process32First函数,然后在Process32First中有Process32Next函数来访问快照中的下一个进程,相当于就是说访问第一个,然后一直下一个下一个

函数原型

BOOL Process32First(
HANDLE           hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL Process32Next(
HANDLE           hSnapshot,
LPPROCESSENTRY32 lppe
);

参数

这两个函数的参数都一样,第一个参数是快照的句柄,第二个参数是一个结构体的指针,在windows编程下的p也就是point是指针的意思,l就是long的意思。第二个参数是一个用来描述快照中的进程信息的一个结构体的指针

LPPROCESSENTRY32
typedef struct tagPROCESSENTRY32 {
DWORD     dwSize;
DWORD     cntUsage;
DWORD     th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD     th32ModuleID;
DWORD     cntThreads;
DWORD     th32ParentProcessID;
LONG     pcPriClassBase;
DWORD     dwFlags;
CHAR     szExeFile[MAX_PATH];
} PROCESSENTRY32;

该结构体是用来描述快照中的进程的信息的,在创建结构体的时候需要初始化dwSize,不然就创建失败,后面的参数不用管,这里就相当于创建了一个描述进程信息的结构体来获取进程信息,不用赋值因为反正后面都会被获得的进程的信息覆盖

返回值

如果成功的话会返回一个Bool类型

遍历系统进程的完整代码

void Ergodic_Process()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL fSuccess = Process32First(hSnapshot, &processEntry);
if (fSuccess)
{
//表示如果成功获取到了快照中的第一个进程
do
{
printf("进程id=%d,进程名字=%s\n", processEntry.th32ProcessID, processEntry.szExeFile);
} while (Process32Next(hSnapshot, &processEntry));
}
}

但是这个不支持中文,以下是修正版

void Ergodic_Process()
{
setlocale(LC_ALL, "chs");
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL fSuccess = Process32First(hSnapshot, &processEntry);
if (fSuccess)
{
//表示如果成功获取到了快照中的第一个进程
do
{
printf("进程id=%d,进程名字=%s\n", processEntry.th32ProcessID, processEntry.szExeFile);
} while (Process32Next(hSnapshot, &processEntry));
}
}