最近,我读了源代码在过程通讯中遇到了这个问题,在网上查了半天也很模糊,所以我决定总结别人的成果,整理一下,希望对有需要的人有帮助,如果有不正当的期待的话就指出来。
首先,我们介绍系统对象:
在系统中,对象分为两类:用户对象和内核对象。 用户的对象是窗口、菜单等。 内核对象包括进程对象、线程对象和文件映射对象等。 标识用户对象的句柄在系统中是唯一的。 因此,两个用户对象进程可以通过该句柄进行交互。 编程中常用的FindWindow ) )函数就是这样。 此函数返回指定窗口的句柄。 你可以把这个方向盘叫做实方向盘吧。 为了提高系统的稳定性,内核对象句柄与进程相关。 每个进程都有一个内核对象表,每个对象的索引都用作内核对象的句柄,从而实现进程相关。 同一对象在每个进程中可能有不同的索引。 也就是说,返回的句柄每次都不同,就像打开文件时一样。 因此,在进行进程通信时,必须使用DuplicateHandle ()函数复制句柄。 这个过程经常用于以下两个函数:
1.GetCurrentProcess()
函数的声明如下:
手持设备连接流程(语音) )。
功能:获取当前进程的句柄。 (此句柄是进程的虚拟句柄,只能在进程内部使用。 如果脱离当前进程,这个句柄就没什么意义了。 此虚拟句柄(CloseHandle ) )不需要关闭。
由此可见,假句柄的存在意义在于使用方便,不会引起内存泄漏。
2.DuplicateHandle()
BOOL DuplicateHandle (
HANDLE hSourceProcessHandle,//handle to source process
HANDLE hSourceHandle,//handle to duplicate
HANDLE hTargetProcessHandle,//handle to target process
LPHANDLE lpTargetHandle,//duplicate handle
DWORD dwDesiredAccess,//requested access
BOOL bInheritHandle,//handle inheritance选项
dworddwoptions//选项动作
);
功能:将一个进程中的伪句柄转换为可用于进程间通信的实际句柄。
主要参数分析:
hSourceProcessHandle :源进程内核的句柄
hSourceHandle :要传递的内核对象句柄。 这是模拟方向盘。
hTargetProcessHandle :目标进程内核的句柄
lpTargetHandle :接受内核对象句柄的地址(实际句柄)
该函数据此将hSourceHandle的资源伪句柄转换为实句柄,复制到lpTargetHandle,通信时用lpTargetHandle指定的句柄进行通信。
其中,第一个和第三个参数可以相同或不同。 如果将一个进程的内核资源句柄复制到另一个进程对象,且两个参数都是GetCurrentProcess (),则表示将该资源对象句柄(即第二个参数句柄)转换为实际句柄因为第一个和第三个参数相同,所以该函数只是将伪句柄转换为实句柄。 要使两个进程通信,必须将此转换后的实句柄传递给其他进程。 如果第三个参数句柄是一个进程的实句柄,而不是GetCurrentProcess (),则此函数不仅会将伪句柄转换为实句柄,还会将转换后的实句柄传递给另一个进程。 (这是我个人的理解,但不知道对不对。 请参阅。