与继承性一样,D u p l i c a t e H a n d l e函数存在的奇怪现象之一是,目标进程没有得到关于新内
核对象现在可以访问它的通知。因此, Process C必须以某种方式来通知Process T,它现在拥有
对内核对象的访问权,并且必须使用某种形式的进程间通信方式,以便将h O b j中的句柄值传递
给Process T。显然,使用命令行参数或者改变Process T的环境变量是不行的,因为该进程已经
启动运行。因此必须使用窗口消息或某种别的I P C机制。
上面是D u p l i c a t e H a n d l e的最普通的用法。如你所见,它是个非常灵活的函数。不过,它很
少在涉及3个不同进程的情况下被使用(因为Process C不可能知道对象的句柄值正在被P r o c e s s
S使用)。通常,当只涉及两个进程时,才调用D u p l i c a t e H a n d l e函数。比如一个进程拥有对另一
个进程想要访问的对象的访问权,或者一个进程想要将内核对象的访问权赋予另一个进程。例
如,Process S拥有对一个内核对象的访问权,并且想要让Process T能够访问该对象。若要做到
这一点,可以像下面这样调用D u p l i c a t e H a n d l e :

在这个例子中,对G e t C u r r e n t P r o c e s s的调用将返回一个伪句柄,该句柄总是用来标识调用
端的进程Process S。一旦D u p l i c a t e H a n d l e返回,h O b j P r o c e s s T就是与Process T相关的句柄,它
所标识的对象与引用Process S中的代码时h O b j P r o c e s s S的句柄标识的对象相同。Process S决不
应该执行下面的代码:

如果Process S要执行该代码,那么对代码的调用可能失败,也可能不会失败。如果P r o c e s s
S恰好拥有对内核对象的访问权,其句柄值与h O b j P r o c e s s T的值相同,那么调用就会成功。该
代码的调用将会关闭某个对象,这样Process S就不再拥有对它的访问权,这当然会导致应用程
序产生不希望有的行为特性。
下面是使用D u p l i c a t e H a n d l e函数的另一种方法。假设一个进程拥有对一个文件映射对象的
读和写访问权。在某个位置上,一个函数被调用,它通过读取文件映射对象来访问它。为了使
应用程序更加健壮,可以使用D u p l i c a t e H a n d l e为现有的对象创建一个新句柄,并确保这个新句
柄拥有对该对象的只读访问权。然后将只读句柄传递给该函数,这样,该函数中的代码就永远
不会偶然对该文件映射对象执行写入操作。下面这个代码说明了这个例子:

D u p l i c a t e H a n d l e函数存在的奇怪现象之一是,目标进程没有得到关于新内 核对象现在可以访问它的通知相关推荐

  1. 复制对象句柄--D u p l i c a t e H a n d l e 函数

    共享跨越进程边界的内核对象的最后一个方法是使用D u p l i c a t e H a n d l e 函数: BOOL DuplicateHandle( HANDLE hSourceProcess ...

  2. C r e a t e P r o c e s s的b I n h e r i t H a n d l e s参数

    使用对象句柄继承性时要执行的下一个步骤是让父进程生成子进程.这要使用C r e a t e P r o c e s s函数来完成: 下一章将详细介绍这个函数的用法,不过现在我想要让你注意b I n h ...

  3. Linux搭建GitLab私有仓库,并内网穿透实现公网访问

    文章目录 前言 1. 下载Gitlab 2. 安装Gitlab 3. 启动Gitlab 4. 安装cpolar 5. 创建隧道配置访问地址 6. 固定GitLab访问地址 6.1 保留二级子域名 6. ...

  4. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  5. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...

  6. python 私有和保护成员变量如何实现?—— 单下划线 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量; 双下划线 开始的是私有成员,意思是只有类对象自己能访问...

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...

  7. html如何创建学生信息表,创建学生对象并且能访问网页

    讲解对象:创建学生对象并且能访问网页 作者:融水公子rsgz 1 templates下面新建两个网页 grades.html 内容: charset="UTF-8"> 班级信 ...

  8. [轉]子窗口和父窗口的函数或对象能否相互访问

    子窗口和父窗口的函数或对象能否相互访问 解决思路:        每一个窗口其实也是一个对象,窗口内的对象或函数就相当于对象内的对象或方法,问题的关键是如何取得窗口对象的控制句柄,不同的窗口的控件句柄 ...

  9. python属性访问顺序_Python 对象属性的访问

    在 Python 中,一切皆对象.属性访问可以理解为是从一个已有的对象中获得另一个对象的方法.对象属性的访问涉及到对象的 __dict__ 属性.描述符等概念,以及 __getattribute__. ...

最新文章

  1. 与其倒推以前不如推到重建
  2. 删除千万级表中重复记录的办法
  3. android 相机路径,android – 如何获取刚从相机捕获的图像路径
  4. /etc/resolv.conf root用户下不能修改
  5. Python-理解装饰器
  6. sonarqube对接maven
  7. 每个人都应该学git,最新GitHub上git指南我不信你不会git
  8. Git笔记(17) 协议
  9. 三星java手机播放器下载_8k视频播放器软件下载安卓-三星8k视频播放器KMPlayer下载v30.10.231 内置提取版-西西软件下载...
  10. 全球服务器系统排行,服务器操作系统排行榜
  11. 菠萝来啦。新一代VueX 来啦 他有一个特别甜的名字“Pinia”,再不学你就out了【 Pinia/Vuex5中文文档】
  12. 全网无损音乐、超清视频免费下!
  13. 为什么不建议在外包公司长期工作及外包公司的简历怎么写
  14. JavaScript 之 调用outlook发邮件功能mailto(附带换行问题)
  15. 06 Redis中BigKey、HotKey的发现与处理
  16. oracle 分区之 interval range 分区
  17. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL【收藏】
  18. 卡特兰数(c++实现)
  19. android+开机+无命令,红米手机怎么刷机
  20. 1028 人口普查(C语言)

热门文章

  1. Linux中__setup()实现原理以及源码分析
  2. 吉德林法则 (Kidlin's Law)的真实案例(2)
  3. 服务端技术方案模板参考
  4. Esper学习之十三:EPL语法(九)
  5. 长宽数据变换_reshape2包_2021-02-28
  6. Unity使用新输入系统InputSystem制作飞机大战Demo
  7. Nature communications:VWFA,一个集语言与注意于一身的脑区
  8. IT项目管理画图题【太原理工大学】
  9. abaqus html安装,abaqus 2016安装错误
  10. JS倒计时效果(不积蛙步无以至千里不积小流无以成江海)