首页 > 其他分享 >句柄的本质?

句柄的本质?

时间:2022-09-01 18:33:19浏览次数:53  
标签:这个 句柄 本质 内存 东西 代号 指针

浅析句柄的本质

本文讨论句柄的本质,使程序员能够真正熟悉经常使用的句柄的含义。相信通过本文会对句柄有一个确切的认识,能够更好的指导编程开发。

在Windows中,句柄是非常有用的东西。什么是句柄。有很多资料,包括MSDN也讲述了句柄是一个32位或者64位的整数值,是一种数据类型,标志了一个对象,可以通过这个句柄访问对象。看了这样的解释,我不相信你就真的明白了句柄是什么。
在C和C++中,指针是无所不能的,因此也是很危险的。系统的很多东西,如果知道确切地址,通过指针就可以直接修改,从而破坏系统。有了指针,指针中的值就存放了内存地址,就可以直接对内存的数据进行修改。系统的内核的东西,是不允许直接访问的,所有操作都必须通过API函数进行,这样就可以保证系统不会被破坏。但是要访问内核的东西,总得要有一个可以定位的东西,比如说地址,这样才能真正知道要操作内核的哪些东西,因为东西很多,总要区分一下。如果说直接给地址,用指针形式进行定位操作,那就会危及系统,所以微软就不提供这种方法来操作。很自然,就采用了一个代号,给内存的所有东西取个名字,就产生一个代号,通过这个代号,你并不知道它的确切的位置,你就无从直接操作它,就不会带来破坏。这个代号要让访问者知道,就必须存储起来,而访问者在系统中是以进程的形式存在的,所以,这些代号就跟进程相关了。一个进程创建了一个东西,这个东西就会返回一个代号,这个代号就记录到进程的一个表了,这样就可以通过这个代号找到这个东西了。而在这个表中,肯定是有一个映射关系的,也就是,这个代号一定会与这个东西的位置进行关联,以后通过这个代号,在表里就能够找到这个东西的地址,然后再操作这个东西。
说了这么多很不专业的描述,相信你对这个过程大致有印象了。这个代号就是句柄,这个表就是句柄表,这个句柄表就是与进程相关的,而这些东西就是系统中被创建的内存中的内存块。现在相信你对于微软为什么搞出一个句柄有所体会了吧。
句柄的存在,保证了系统的安全,程序员不用通过指针直接操作内存中的东西,将句柄传入API函数,函数在内部会在当前的进程的句柄表中去找这个句柄对应的内存块的地址,以及判断该内存块的访问权限和标志,然后再执行之后的操作。这样一来,如果是非法访问,你对于那块内存面都见不到,更不用说去破坏了。而如果是指针,只要指针指向了那个内存块,你就可以对它任意操作了。
所以说,理解句柄,理解到这个地步,你脑子的很多疑问都会自然的没了,看句柄也会顺眼多了。线程句柄、文件句柄、GDI句柄等等,本质都是一样的。如果你不理解的话,还要以为是好多种数据类型,其实就是一个类型。知道了本质,一切都很自然了。
当然,本文只是大致讨论了一下,要想更加深入的理解,本文是远远不够。但是对于初学者来说,了解到这个,已经很够用了。

标签:这个,句柄,本质,内存,东西,代号,指针
From: https://www.cnblogs.com/amxiang/p/16647480.html

相关文章

  • 句柄
    关键字:句柄,HANDLE,WINDOWSSDK,windows.h,从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别......
  • C#线程:使用事件等待句柄发送信号
    最简单的信号发送结构是事件等待句柄(注意它和C#的事件是无关的)。事件等待句柄有三种实现:AutoResetEvent、ManualResetEvent(Slim)和CountdownEvent。前两种基于通用的Event......
  • 产品化思维之-工作流本质和几个概念
    这篇文章是约10年前我和同事的一个关于工作流的讨论的一个备忘,现在转到这里做了备份。现在看有些观念和认识落伍了,也不一定正确,但是仍有一定的参考价值。---------------......
  • 学习:python进阶 for循环本质
    思考:python中有while循环为很么还有for循环? 结论:while循环可以做循环遍历操作,但是远远不如for循环简结实用。while循环适合做条件循环,for循环适合做迭代器循环。......
  • Java方法重载的本质
    Java方法重载的本质publicclassDispatcherClient{publicstaticvoidmain(String[]args){Animala=newAnimal();Animala1=newDog()......
  • 注解-JDK内置注解以及自定义注解-格式&本质
    JDK内置注解JDK中预定义的一些注解:1,@Override-检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。2,@Deprecated-标记过时方......
  • 2022牛客多校 补赛 C Cmostp(区间结尾本质不同子串)
    多次询问求一个串的结尾在\([l,r]\)之间的本质不同子串个数。此题是求一个区间的不同元素的问题,使用扫描线的方法解决,即每次加入一个元素就将这个位置\(+1\),这个元素上一......
  • 《线性代数的本质》笔记
    零、引言内容出自该链接一、向量1.1什么是向量向量是空间中的箭头,决定一个向量的是它的长度和它所指的方向,可以在空间自由落脚向量是有序的数字列表(此时二维向量代......
  • 1024 [USACO 2007 Mar G]Ranking the Cows 计算总共确定的关系数目 floyd本质+传递闭
    链接:https://ac.nowcoder.com/acm/contest/26077/1024来源:牛客网题目描述EachofFarmerJohn'sNcows(1≤N≤1,000)producesmilkata......
  • php SplFileInfo SplFileObject 关闭句柄方法
    2022年8月19日10:26:45$fileName='robots.txt';//开启句柄$file1=newSplFileInfo($fileName);echo$file1->getFilename();//关闭句柄$file=nu......