1.什么是线程?
答:一个线程就是操作系统的一个内核对象,在Windows操作系统内核中没有进程的概念,只有线程的概念,进程只不过是在逻辑上对一组线程及相关的资源进行的一种封装。
2.什么是进程?
答:进程是一个正在运行的程序,有一个虚拟的地址空间(4gb),地址空间有加载的exe,同时也有程序运行时所必须的dll,进程内核对象,至少一个运行的线程。
3.什么是模块,模块句柄的本质是什么?
答:模块是在内核控件运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是其代码可以在运行是链接到系统中作为内核的一部分运行或从内核中取下,可以动态扩展内核的功能,模块句柄的本质是模块加载进内存空间的基址。
对于内核对象句柄来说,进程中有一个句柄,不同进程中的句柄表存储的相同的句柄值代表的不是一个内核对象,句柄内核对象在进程句柄表中的索引,不同进程的相同句柄指向的不一定是同一个对象。
在不同进程中访问同一个内核对象:
1.由父进程继承给子进程。注意:即便继承了句柄,子进程却不知道自己继承了谁,句柄是什么,这只能由父进程通过进程间的通讯的方式告诉它。
2.在进程A中创建内核对象的时候,给内核对象命名,在进程B中,通过名字打开内核对象,假如此内核对象不能命名或者没有一个标识,那么就无法使用这种方式
3.使用DUplicateHandle()函数,将一个句柄从一个进程传递给另一个进程。
创建进程:
#include <windows.h>
int main()
{
STARTUPINFO st = {};
PROCESS_INFORMATION pi = {};
CreateProcess(
L"D:\\Program Files\\Tencent\\QQ\\Bin\\QQScLauncher.exe",//路径
NULL, //命令
NULL, //进程的安全属性
NULL, //线程的安全属性
FALSE, //句柄是否继承
NULL, //子进程创建方式
NULL, //环境
NULL, //程序的运行目录
&st, //启动信息
&pi //进程信息
);
return 0;
}
结束进程
void KillProcess()
{
//1 打开进程
HANDLE hProcess = OpenProcess(
PROCESS_