这篇文章是对windows对象的总结,在winows编程中,windows对象,句柄是一个基本概念,理解这些概念有助于后面的windows编程学习。文章的形式还是以解答问题的方式来组织。

注:在文中,对象对应的英语翻译是object,句柄对应的英语翻译是handle.

1. 在windows中,什么是对象?

欲解释内核对象,需要先解释windows下对象(object)和句柄的概念。在windows中,对象其实指的是一个通用的结构,这个数据结构代表的一个系统资源,例如一个文件资源,线程资源等等。当我们操作的时候,只能通过句柄来操作这个对象代表的资源,无论你是文件还是线程。这个时候会有一个问题:
windows为什么要将对象统一起来,只能通过句柄来操作对象代表的资源?
大约有以下几点原因:

*统一使用句柄,可以理解为封装,这意味着用户不需要关心对象的具体细节。这样就可以在系统升级的时候对用户的程序没有影响。

*更好地利用windows安全策略,每个对象都有独立的访问控制列表(ACL),这样就可以限定访问对象的行为。例如我们想要读取某个文件,但是当前用户没有权限,那么就会返回一个空的句柄。

2.windows对象都有哪些呢?

在windows编程中,我们每时每刻都在和windows对象打交道,例如进程,线程,文件等等。其实微软对windows对象做了分类:用户对象,内核对象,GDI(这是图像驱动接口,在这里不讨论这个)。
用户对象

主要用来窗口相关的管理,例如Cursor,Hook,Window,这些都是用户对象

内核对象

用来进行更底层的系统资源管理,例如内存,进程通信等等。

更详细的信息请点击链接(msdn).

在这里,需要简单说下用户对象和内核对象一个重要的区别:

每个用户对象只能有一个句柄;而每个内核对象却可以有多个句柄,例如:Mutex是内核对象,用于多进程的同步,在某处创建,返回句柄,也可以在其它的进程打开(这其实也依赖此内核对象的安全属性设置)。

3 .内核对象共享的方式有哪些,系统是如何知道什么时候该销毁此对象呢?

在此需要说明下,内核对象共享指的是跨进程共享内核对象。

先说第二个问题,当我们不需要使用内核对象的时候,直接调用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对象的总结。

windows对象总结的更多相关文章

  1. 报表软件JS开发引用HTML DOM的windows对象

    HTML DOM是W3C标准(是HTML文档对象模型的英文缩写,Document Object Model for HTML). HTML DOM定义了用于HTML的一些列标准的对象,以及访问和处理H ...

  2. js windows对象

    一.DOM操作 windows对象操作 document对象操作     二.属性.事件 1.window的属性: window.shuxing(属性) window.fangfa()(方法) 方法后 ...

  3. JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

    DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象 ...

  4. HTML DOM部分---事件 windows对象;

    <!--DOM操作windows对象操作 对浏览器进行操作document对象操作 对浏览器内页面文件进行操作 window.shuxing;属性调用格式window.fangfa();方法调用 ...

  5. windows对象的属性和方法

    window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用标志符window来引用它. 一. windows对象的属性 1. locati ...

  6. javascript windows对象

    1.windows对象方法 2.计时器方法 3.计时器setInterval() <!DOCTYPE HTML> <html> <head> <meta ht ...

  7. JavaScript面向对象之Windows对象

    JavaScript之Window对象 首先我们先了解一个概念:事件. 事件,就是把一段代码设置好,满足条件时触发.或者说,事件是可以被 JavaScript 侦测到的行为. 网页中每个元素都可以触发 ...

  8. JavaScript学习 - 基础(五) - string/array/function/windows对象

    String对象 更详细转:http://www.w3school.com.cn/jsref/jsref_obj_string.asp //------------------------------ ...

  9. Windows对象、句柄与MFC对象

    windowsmfc编程c 目录(?)[-] Windows对象句柄与MFC对象 windows对象 句柄 mfc对象 杂谈 Windows对象.句柄与MFC对象 (2009-04-28 22:11: ...

随机推荐

  1. Wix - 教程

    1. 不错的教程 http://www.merlinia.com/mdt/WiXTutorial4.msl 2.

  2. Gradle version 2.10 is required. Current version is 2.8.

    今天在网上下载了EasyPusher-master文件,日期是20160527版本的,但是在我的Android Studio上运行时报错: Error:(1, 1) A problem occurre ...

  3. java中jvm的工作原理

    首先我们安装了jdk和jre,但是jdk是为java软件开发工程师而使用的开发工具,我们运行java项目只要含有jre文件即可.对于jvm是内存分配的一块区域,我们知道,当我们开始使用java命令时, ...

  4. error in Swift. “Consecutive Declarations On A Line Must Be Separated By ';'”

    当输入的时候以上代码的时候出现这个错误,经过尝试发现条件表达式?前面应该有一个空格  不然会和swift中的?和 !混淆

  5. java总结文章

    java总结文章 原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),须要转载的,保留下! Thanks Talk is cheap. Show me th ...

  6. Socket tips: UDP Echo service - Server code

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...

  7. UIView层次管理bringSubviewToFront,sendSubviewToBack

    将一个UIView显示在最前面只需要调用其父视图的 bringSubviewToFront()方法. 将一个UIView层推送到背后只需要调用其父视图的 sendSubviewToBack()方法. ...

  8. 【IOS】IOS高速入门之OC语法

    Objective-C 是 C 语言的超集 您还能够訪问标准 C 库例程,比如在stdlib.h和stdio.h中声明的那些例程. Objective-C 还是一种很动态的程序设计语言,并且这样的动态 ...

  9. [小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证

    在一些 Web 系统中,身份验证是依靠硬件证书进行的:在电脑上插入 USB 证书,浏览器插件读取证书的相关信息,然后在发送 HTTP 登录请求时顺便在 Header 字段附加上身份信息.服务器端处理这 ...

  10. Java基础知识强化38:StringBuffer类之StringBuffer的添加功能

    1. StringBuffer的添加功能: public  StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身. publ ...