DuplicateHandle函数学习到的知识。

其实我们在使用函数GetCurrentProcess获得的句柄值是虚假的句柄值。如果我们需要在进程之间通信使用这些句柄的话,就需要将其转换。

下边的是MSDN上面的解释:

The pseudo handle need not be closed when it is no longer needed. Calling the CloseHandle function with a pseudo handle has no effect. If the pseudo handle is duplicated by DuplicateHandle, the duplicate handle must be closed.

这个伪句柄在不再使用的时候是不需要关闭的,使用CloseHandle函数来关闭伪句柄是没有作用的。如果伪句柄被DuplicateHandle函数复制,那么复制的句柄就必须被关闭。

所以我们在使用GetCurrentProcess/GetCurrentThread得到的句柄只适合进程或者线程内部使用。


在系统中,对象被分为两类:内核对象和用户对象,如进程对象,线程对象,文件映射对象都是内核对象;而窗口菜单等,都是用户对象。

两者之间的区别:

用于标识用户对象的句柄是系统唯一的,这也就是为什么一个进程可以对另外一个的用户对象句柄进行操作。

内核对象是为了加强内核系统的稳定性,因此,内核对象句柄的进程相关的,在每一个进程中,都有一个内核对象表,每一个对象的索引(不完全是)作为内核对象的句柄。


由于DuplicateHandle复制的句柄和源句柄的对象指向的是同一个对象,所以,任何对复制句柄的改变都会影响到源句柄和目的句柄。


转自:http://mzf2008.blog.163.com/blog/static/35599786201152815654616/