首页 > 其他分享 >句柄

句柄

时间:2022-10-12 23:33:19浏览次数:66  
标签:对象 句柄 应用程序 WINDOWS Windows 内存

句柄,是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例​​,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个​​指针​​​,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,​​Windows​​使用了大量的句柄来标识很多对象。

中文名

句柄

外文名

Handle

定    义

是整个windows编程的基础

使    用

使用的一个唯一的整数值

由    来

源于内存管理机制—虚拟地址

重要性

在许多地方都扮演着重要的角色

目录

1​​由来​

2​​项目包括​

3​​原理​

4​​语句​

5​​作用​

6​​注意事项​

7​​编译原理​

1由来​​编辑​

windows 之所以要设立句柄,根本上源于内存管理机制的问题—​​虚拟地址​​,简而言之数据的地址需要变动,变动以后就需要有人来记录管理变动,(就好像户籍管理一样),因此系统用句柄来记载数据地址的变更。

数据对象加载进入内存中之后即获得了地址,但是这个地址并不是固定的,(至于为什么以及什么情况下变动具体需要大家 研究虚拟地址的原理与机制我这里只提我确定知道的例子)数据对象会根据需要在内存与硬盘之间游弋移动(例如不常用的数据会为常用数据让出其占用的内存空间 进而被淘汰进硬盘中的虚拟内存之中以优化配置整体系统的资源进而提升效率性能),因此其物理地址总是变动的,那么作为管理者 则必须对 管理对象所发生的变化了如指掌才行,因此系统为进程分配固定的地址(句柄)来存储进程下的数据对象变化后的地址也就是当前的地址,其实设计机制很简单 :系统的某个部门移动了对象的地址后,同时上报给句柄所属部门管理者,管理者将改动写入句柄即可。该数据被重新起用时去其所属句柄内按内容存取即可。

句柄,英文:HANDLE,在Windows编程中是一个很重要的概念,在许多地方都扮演着重要的角色。但由此而产 生的句柄概念也大同小异,比如:《Microsoft Windows 3 Developer's Workshop》(Microsoft Press,by Richard Wilton)一书中句柄的概念是:在Windows环境中,句柄是用来标识项目的。

在程序设计中,句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。

句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。

在上世纪80年代的操作系统(如Mac OS 和Windows)的​​内存管理​​​中,句柄被广泛应用。Unix系统的文件描述符基本上也属于句柄。和其它桌面环境一样,Windows​​API​​大 量使用句柄来标识系统中的对象,并建立操作系统与用户空间之间的通信渠道。例如,桌面上的一个窗体由一个HWND类型的句柄来标识。如今,内存容量的增大 和虚拟内存算法使得更简单的指针愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多操作系统仍然把指向私有对象的指针以及进程传递给客户端 的内部数组下标称为句柄。[1]

2项目包括​​编辑​

*.模块(module)

*.任务(task)

*.实例(instance)

*.文件(file)

*.内存块(block of memory)

*.菜单(menu)

*.控件(control)

*.字体(font)

*.资源(resource),包括图标(icon),光标(cursor),字符串(string)等

*.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域(region),以及​​设备描述表​​(device context)。

3原理​​编辑​

句柄_句柄

WINDOWS程序中并不是用​​物理地址​​来标识一个内存块,文件,任务或动态装入模块的。相反,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

在《WINDOWS编程短平快》(南京大学出版社)一书中是这么说的:句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控件,位图,GDI对象等等。WINDOWS句柄有点像C语言中的​​文件句柄​​。

从上面的2个定义中我们可以看到,句柄是一个​​标识符​​​,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位(或64位)的​​无符号整数​​​。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(​​设备描述表​​句柄),HICON(图标句柄)等等。这当中还有一个通用的句柄,就是HANDLE。

4语句​​编辑​

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2条语句都是对的,表达的是一个意义.

一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多​​API函数​​​,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。另外,WINDOWS也能通过应用程序的​​引出函数​​将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行操作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。

一个句柄,只有当唯一地确定了一个项目的时候,它才开始有意义。句柄对应着项目表中的一项,而只有WINDOWS本 身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄。举个例子来说吧,比如:我们可以为我们的应用程序申请一块内存块,通过调用API函 数GlobalAlloc,来返回一个句柄值:

hMem=GlobalAlloc(......);

现在的hMem是个索引值 不是​​物理地址​​, 应用程序还不能直接存取这块内存。这儿还有一句题外话,是关于操作系统的内存管理的。一般情况下操作系统给应用程序分配的内存块都是可以被移动的或者是可 以丢弃的,这样能使有限的内存资源得到充分利用。所以,我们刚开始分配到的那块内存的地址是不确定的,因为它是可以被移动的,所以得先锁定那块内存块,这 里应用程序需要调用API函数GlobalLock函数来锁定句柄。如下:

lpMem=GlobalLock(hMem);

这样应用程序才能存取这块内存。

5作用​​编辑​

句柄是一个标识符,是拿来标识对象或者项目的。

如果想更透彻一点地认识句柄,我可以告诉大家,句柄类似指向​​指针​​​的指针,仅仅是类似,通过句柄可以找到对应的数据,但是不是二级指针。我们知道,所谓指针是一种​​内存地址​​​。应用程序启动后,组成这个程序的各对象是驻留在内存中的。简单地理解,似乎我们只要获知这个内存的首地址,就可以随时用这个地址访问对象了。如果您真的这样认为,那您可就大错特错了。我们知道,Windows是一个以​​虚拟内存​​​为基础的操作系统。在这种系统环境下,Windows​​内存管理器​​经常在内存中来回移动对象,以此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找那一个对象呢?

为了解决这个问题,Windows操作系统为全体应用程序腾出一些内存单元,用来专门登记各应用程序的对象在内存中 的地址的变化,而前者的物理地址在系统运行期间是始终保持不变的。Windows内存管理器移动了对象在内存中的位置后,会把该对象新的地址及时地告知给 对应的句柄进行更新。这样我们只要知道这个句柄,就可以间接地知道对象具体在内存中的哪个位置了。这个地址是在对象装载(Load)时由系统分配给的,当 对象卸载时(Unload)又释放给系统。

6注意事项​​编辑​

​内核对象​​句柄,是用来标识某个内核对象的一个ID 同一个对象的该id对于每个进程是不同的,具体如何实现是ms不公开的算法,以下是一个近似的,可能的算法:

进程创建时,windows系统为进程构造了一个​​句柄表​

当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时

系统会将在句柄表中增加一个表项,表项的内容中存储了指向目标内核对象的​​指针​

同时,系统返回这个表项在句柄表中的索引作为句柄

7编译原理​​编辑​

一个句型的最左直接短语称为该句型的句柄,句型的句柄是和某产生式右部匹配的子串,并且,把它规约成该产生式左部的非​​终结符​​,

句柄_应用程序_02

​句柄

如右图,在推导过程中,S→aABe→aAde→aAbcde→abbcde,此四步的句柄分别为aABe,d,Abc,b

句柄的特征:

1. 它是直接短语,即某规则右部。

2. 它具有最左性。

注意:短语、直接短语和句柄都是针对某一句型的,特指句型中的哪些符号子串能构成短语和直接短语,离开具体的句型来谈短语、直接短语和句柄是无意义的。另外句柄的右边仅含终结符如果​​文法​​二义,那么句柄可能不唯一。[2]

龙腾一族至尊龙骑



标签:对象,句柄,应用程序,WINDOWS,Windows,内存
From: https://blog.51cto.com/u_15693505/5751880

相关文章

  • EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构:EPROCESS/KPROCESS/PEB。把它们放到一起是因为这三个数据结构及其......
  • SV学习(6)——类的继承、句柄的使
    SV学习(6)——类的继承、句柄的使用1.类的成员访问类型2.类的继承extends3.子类索引父类的同名函数super4.成员覆盖补充一个有趣的代码5.句柄的传递6.......
  • 【反射】方法句柄
    publicclassPerson{privateStringname="小张";publicvoidsay(Stringc){System.out.println(c);}publicvoidsay(){......
  • 五、句柄表
    5.1.全局句柄1.全局句柄表中只存储进程和线程对象,把PID/CID当作索引在全局句柄表中查找对应对象结构.2全局句柄表有三张表:0表:共4096字节,每个元素占8个字节,总共可以......
  • 句柄2
    文章目录什么是句柄句柄的本质理解为什么需要句柄什么是句柄句柄是一个整数,单独的看它只是数字。但这个整数是进程句柄表数组的下标,有了这个下标,操作系统就可以......
  • 句柄的本质?
    浅析句柄的本质本文讨论句柄的本质,使程序员能够真正熟悉经常使用的句柄的含义。相信通过本文会对句柄有一个确切的认识,能够更好的指导编程开发。在Windows中,句柄是非常有用......
  • 句柄
    关键字:句柄,HANDLE,WINDOWSSDK,windows.h,从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别......
  • C#线程:使用事件等待句柄发送信号
    最简单的信号发送结构是事件等待句柄(注意它和C#的事件是无关的)。事件等待句柄有三种实现:AutoResetEvent、ManualResetEvent(Slim)和CountdownEvent。前两种基于通用的Event......
  • php SplFileInfo SplFileObject 关闭句柄方法
    2022年8月19日10:26:45$fileName='robots.txt';//开启句柄$file1=newSplFileInfo($fileName);echo$file1->getFilename();//关闭句柄$file=nu......