这篇文章是对windows对象的总结,在winows编程中,windows对象,句柄是一个基本概念,理解这些概念有助于后面的windows编程学习。文章的形式仍是以解答问题的方式来组织。编程
注:在文中,对象对应的英语翻译是object,句柄对应的英语翻译是handle.windows
欲解释内核对象,须要先解释windows下对象(object)和句柄的概念。在windows中,对象其实指的是一个通用的结构,这个数据结构表明的一个系统资源,例如一个文件资源,线程资源等等。当咱们操做的时候,只能经过句柄来操做这个对象表明的资源,不管你是文件仍是线程。这个时候会有一个问题:
windows为何要将对象统一块儿来,只能经过句柄来操做对象表明的资源?
大约有如下几点缘由:安全
*统一使用句柄,能够理解为封装,这意味着用户不须要关心对象的具体细节。这样就能够在系统升级的时候对用户的程序没有影响。数据结构
*更好地利用windows安全策略,每一个对象都有独立的访问控制列表(ACL),这样就能够限定访问对象的行为。例如咱们想要读取某个文件,可是当前用户没有权限,那么就会返回一个空的句柄。学习
在windows编程中,咱们每时每刻都在和windows对象打交道,例如进程,线程,文件等等。其实微软对windows对象作了分类:用户对象,内核对象,GDI(这是图像驱动接口,在这里不讨论这个)。
用户对象线程
主要用来窗口相关的管理,例如Cursor,Hook,Window,这些都是用户对象翻译
内核对象对象
用来进行更底层的系统资源管理,例如内存,进程通讯等等。继承
更详细的信息请点击连接(msdn).接口
在这里,须要简单说下用户对象和内核对象一个重要的区别:
每一个用户对象只能有一个句柄;而每一个内核对象却能够有多个句柄,例如:Mutex是内核对象,用于多进程的同步,在某处建立,返回句柄,也能够在其它的进程打开(这其实也依赖此内核对象的安全属性设置)。
在此须要说明下,内核对象共享指的是跨进程共享内核对象。
先说第二个问题,当咱们不须要使用内核对象的时候,直接调用CloseHandle便可,在系统内部维护着此内核对象的信息,当使用此内核对象的进程为0时,系统会销毁此对象。
接下来就是内核对象的共享方式了,首先要了解,为何要共享内核对象?缘由很简单:在不少场景下都须要使用共享内核对象的方式,例如使用文件映射对象能够在不一样进程之间共享数据。
在windows中,有三种方法能够用来共享内核对象:
a. 继承
在建立内核对象时,须要使用默认的安全性来建立,同时要将SECURITY_ATTRIBUTES中的bInhertHandle置为true。这样在建立子进程的时候,将建立的参数--bInheritHandles设置为true,这样就能够子进程就能够访问父进程相应的内核对象了。
b. 为对象命名
首先a进程建立一个内核对象,并对其命名为A,若是b进程想访问A,那么能够建立一个相同的内核对象,将其命名为A,若是b对象有足够的权限,那么新建立的内核对象将指向A,b进程就能够访问A了。
c. 使用DuplicateHandle方法
A进程调用此方法,将B进程中的内核对象共享到C进程中。
以上就是对Windows对象的总结。