首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Win32进程创建、进程快照、进程终止用例

Win32进程创建、进程快照、进程终止用例

进程创建:
1 #include <windows.h>
2 #include <stdio.h>
3
4 int main()
5 {
6     // 创建打开系统自带记事本进程
7     STARTUPINFO si1 = {sizeof(si1)};
8     PROCESS_INFORMATION pi1;
9     char * szCmdLine1 = "notepad";
10     if(::CreateProcess(NULL, szCmdLine1, NULL, NULL, FALSE, NULL, NULL, NULL, &si1, &pi1))
11         printf("Create notepad process successfully!\n");
12
13
14     // 新建一个cmd进程窗口
15     char* szCmdLine2 = "cmd";
16     STARTUPINFO si2 = {sizeof(si2)};
17     PROCESS_INFORMATION pi2;
18     si2.dwFlags = STARTF_USESHOWWINDOW;        // 指定wShowWindow成员有效
19     si2.wShowWindow = TRUE;                    // 此成员设为TRUE的话则显示新建进程的主窗口,FALSE不显示
20
21     BOOL bRet = ::CreateProcess(
22                                 NULL,                    // 不在此指定可执行文件的文件名
23                                 szCmdLine2,                // 命令行参数
24                                 NULL,                    // 默认进程安全性
25                                 NULL,                    // 默认线程安全性
26                                 FALSE,                    // 指定当前进程内的句柄不可以被子进程继承
27                                 CREATE_NEW_CONSOLE,        // 为新进程创建一个新的控制台窗口,如果为NULL,不会创建新的窗口
28                                 NULL,                    // 使用本进程的环境变量
29                                 NULL,                    // 使用本进程的驱动器和目录
30                                 &si1,
31                                 &pi2);
32
33     if (bRet)
34     {
35         // 既然不使用两个句柄,最好是立刻将它们关闭
36         ::CloseHandle(pi2.hThread);
37         ::CloseHandle(pi2.hProcess);
38         printf("新进程的进程ID号:%d\n", pi2.dwProcessId);
39         printf("新进程的主线程ID号:%d\n", pi2.dwThreadId);
40     }
41
42     return 0;
43 }
复制代码
运行效果:

复制代码
进程快照
1 #include <windows.h>
2 #include <TLHELP32.H>            // 声明快照函数的头文件
3 #include <stdio.h>
4
5 int main()
6 {
7     PROCESSENTRY32 pe32;
8     pe32.dwSize = sizeof(pe32);
9
10     // 给系统内的所有进程拍一个快照--改函数用于获取系统指定进程的快照,也可以传入不同参数获取被这些进程使用的堆、模块和线程的快照
11     HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
12     if (hProcessSnap == INVALID_HANDLE_VALUE)
13     {
14         printf("CreateToolhelp32Snapshot 调用失败!\n");
15         return -1;
16     }
17
18     // 遍历进程快照,轮流显示每个进程的信息
19     BOOL bMore = :rocess32First(hProcessSnap, &pe32);
20     while(bMore)
21     {  
22         printf("进程名称:%s\n", pe32.szExeFile);
23         printf("进程ID号:%u\n\n", pe32.th32ProcessID);
24         bMore = :rocess32Next(hProcessSnap, &pe32);
25     }
26
27     // 不要忘记清除掉snapshot 对象
28     ::CloseHandle(hProcessSnap);
29     return 0;
30 }
注释:
CreateToolhelp32Snapshot 用于获取系统内指定进程的快照,也可以获取被这些进程使用的堆、模块和线程的快照。函数的具体用法是。
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, // 用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID // 一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
);
本函数不仅可以获取进程列表,也可以用来获取线程和模块等对象的列表。dwFlags 参数指定了获取的列表的类型,其值可以是:
TH32CS_SNAPHEAPLIST 枚举 th32ProcessID 参数指定的进程中的堆。
TH32CS_SNAPMODULE 枚举 th32ProcessID 参数指定的进程中的模块。
TH32CS_SNAPPROCESS 枚举系统范围内的进程,此时 th32ProcessID 参数被忽略。
TH32CS_SNAPTHREAD 枚举系统范围内的线程,此时 th32ProcessID 参数被忽略。
函数执行成功将返回一个快照句柄,否则返回 INVALID_HANDLE_VALUE(即-1) 。
从快照列表中获取进程信息需要使用 Process32First 和 Process32Next 函数, 函数的每次调用仅返回一个进程的信息。Process32First 函数用来进行首次调用,以后的调用由
Process32Next 函数循环完成,直到所有的信息都被获取为止。当不再有剩余信息的时候,函数返回 FALSE,所以程序中使用下面的循环结构来获取进程列表。
BOOL bMore = :rocess32First(hProcessSnap, &pe32);
while(bMore)
{ // 在这里处理返回到 PROCESSENTRY32 中的进程信息
bMore = :rocess32Next(hProcessSnap, &pe32);
}
继承事业,薪火相传
返回列表