对句柄的认识

Linux句柄是什么? 句柄句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引 指针:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据 (在Linux 有相应机制,但没有统一的句柄类型,各种类型的系统资源由各自的类型来标识,由各自的接口操作。) 当把硬盘上的资源调入内存以后,将有一个句柄指向它,但是句柄只能指向一个资源。而且 阅读详情
之前在编写MFC程序的时候,有时会碰到句柄这一概念,由于对它一直不是很重视,所以并没有主动去了解它.随着不断深入学习MFC,特别是看完候先生的<<深入浅出MFC>>后,对句柄的实质产生了很大的兴趣,于是到处收集资料,现在总结一下.

       handle的中文意思主要有多种,一种是作为名词:柄,把柄;一种是作为动词:处理.硬要从中文意思来说的话,这两种中文意思都可以用来勉强解释句柄.例如一个锅的手柄,你只要抓住了它,你就可以很好地操作那个锅,不过很明显你只能通过锅的手柄来做一些诸如炒菜之类的事,你不可能是因为抓住了锅的手柄才能去看电视.不能的物体都会至少有一个属于它的"手柄".在MFC里面,有很多对象,例如对话框,窗口,画笔,显示器,打印机等,每个对象都会产生一个属于它自己的句柄.oh!慢着,似乎还没说清楚句柄的本质,下面再作详细的解说吧.

       如果查看各种HANDLE的定义,如HDC,HPEN,HINSTANCE等等,你会发现有这样一个声明:

       DECLARE_HANDLE(HDC);

       再把DECLARE_HANDLE这个宏展开来看一下:

       #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name

       这是什么意思?用HDC替换上面的name来看看,我们就得到了下面的一段代码:

      struct HDC__

       {

       int unused;

       };

       typedef struct HDC__ *HDC

        oh,原来句柄就是一个指向某一结构的指针,这个结构体只有一个成员,它是一个整数(不知为什么MS要把这个成员叫做unused,难道真的没有用吗?).

        嗯,我们再看一个HANDLE的定义,在winnt.h头文件中,我们看到了HANDLE的定义:

        typedef PVOID HANDEL;

        PVOID是什么?再看它的定义:

        typedef void *PVOID;

        真相出来了,原来HANDLE不过是一个指向void型,即无类型的指针,嗯,目前的指针是32位的吧.其实也不能说HANDLE是一种指针,它只充当一种索引的作用.真的很难解释HANDLE是什么,再往下看看,只能意会吧,呵呵.

        知道了HANDLE的本质(一个32位的整数,用16进制表示),再来说说HANDLE的作用.看我前面第二段的例子,你可以了解到为了控制一个物体,你需要找到它的"手柄".HANDLE就是充当win32下各种"物体"的"手柄".事实上,很多windows API都需要一个HANDLE作为输入参数,这是因为API需要和一些你看不见的对象打交道,这些对象是不能被你所移动或修改的,所以不能给你一个指针来对它进行操作.oh,指针的确是个好东西,它所拥有的能力实在太强大了,但所谓能力越大,责任越大,使用指针的时候千万要小心,不然会造成毁灭性的错误.所以,为了安全,还是给你一个HANDLE吧,通过这个HANDLE,你就可以对那些对象进行一些处理.HANDLE在这里充当什么角色呢?应该算是一个中间人吧,HANDLE是固定的,它不会变,但是对象的地址会变,当对象在内存中的位置发生改变后,我们不能通过之前的对象指针找到对象,怎么办呢?嗯,这时候HANDLE的用处就出来了,HANDLE就是用来记录对象的最新地址的.有点明白了吧?换一种说法吧,嗯,其实就是你知道HANDLE在哪里,但你不知道对象在哪里,而HANDLE知道对象在哪里,所以,只要你知道了HANDLE在哪里,你就能找到对象(尽管你还是不知那个对象住在内存的哪个地方,不过找到它就行了,不是吗?).嗯,是不是有点像索引的作用呢?为什么不给我们知道对象在内存中的位置呢?呵呵,操作系统怕你对它进行一些不利的操作啊.反正你通过HANDLE能让对象做它应该做的事,这就足够了.这就是封装吧,MS最喜欢做的事情,呵呵.

       其实对于HANDLE的定义,MS公司也不能说得清清楚楚,把HANDLE翻译成句柄也是不太合适的,但有时就是这样,英文能理解的东西,翻译到中文反而就混乱了,所以"句柄"这个名词比较适合初学者,如我.那些有丰富编程经验的人一定不喜欢使用"句柄"这个名词吧,还是用handle这个原版英文单词比较容易理解.

Linux 句柄是什么 ? 1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作。 2.句柄不是指针,操作系统用句柄可以找到一块内存,这个句柄可能是标识符,map的key,也可能是指针,看操作系统怎么处理的了。 fd算是在某种程度上替代句柄吧; Linux 有相应机制,但没有统一的句柄类型,各种类型的系统资源由各自的类型来标识,由各自的接口操作。 3.ht 阅读详情

相关推荐

什么是句柄句柄有什么作用

对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚。查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以比喻、类比的方式说明,这种方法虽然形象易懂,但并没有从原理上、本质上加以揭示,让人仍然想问“为什么?”、“怎么实现?”。另一种是给出源代码,无可厚非,这当然是最本质的说明了,但这样一来,又显得不够直观,初学者理解起来有一定的难度。鉴于此,在下尽微末之能,结合自己的愚见,在两者之间折中,用图解的方式来将原理呈现出来,做到一目了然。 这里

qq_43594926的博客 2万+

句柄是什么

句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量。 Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存

顺其自然~专栏 7491

句柄详解,什么是句柄句柄有什么用?

最近在做项目时遇到了句柄的概念,之前只知道在编译原理里有句柄的概念,在实际的编程时会经常用到句柄。 参考地址:https://www.cnblogs.com/zpcdbky/p/4652151.html 这里需要说明: 1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4...

LJH_Gemini的博客 7004

什么是句柄,如何获取句柄

句柄是一个用来标识对象或者项目的标识符,它可以是一个整数、指针或其他数据类型,用于在操作系统或应用程序中唯一地标识某个对象。这些对象可以包括窗口、文件、进程、控件、位图、GDI对象(如画笔、画刷等)等。句柄的引入主要是为了解决内存管理机制中虚拟地址变动的问题,使得系统能够记录和管理数据地址的变更。

2301_80019403的博客 5083

Windows句柄表学习笔记 —— 句柄表&全局句柄

Windows句柄表学习笔记 —— 句柄表&全局句柄表前言句柄表实验一:在WinDbg中查看句柄表第一步:打开一个Win32窗口程序第二步:编译并运行以下代码第三步:查看运行结果第四步:在WinDbg中定位句柄句柄表结构实验二:在WinDbg中查看并分析句柄表结构第一步:打开一个Win32窗口程序第二步:编译以下代码并运行第三步:查看运行结果第四步:在WinDbg中定位最后一个句柄第五步...

lzyddf的博客 4826

笔记:简要介绍什么是句柄(Handle)常见句柄都有哪些

Windows 操作系统中,句柄(Handle)是一个用于标识和管理系统资源的抽象标识符。不同类型的句柄用于管理不同类型的资源。以下是一些常见的句柄类型及其用途:常见句柄类型• 窗口句柄(HWND):用于标识窗口和控件。• 文件句柄(HFILE):用于标识文件和文件流。• 设备句柄(HDEV):用于标识设备。• GDI 对象句柄:用于标识图形设备接口对象。• 用户对象句柄:用于标识用户界面对象。• 线程句柄(HTHREAD):用于标识线程。

HeBianGu的博客 4452

进程句柄,线程句柄,窗口句柄,其它句柄及其与分页机制关系

进程句柄,线程句柄,窗口句柄,其它句柄及其与分页机制关系。

lza_csdn2019的博客 1514

文件句柄

一、文件句柄是什么? 对象在内存中是经常来回移动的,如何快速定位找到这个对象呢? 句柄说: “我来帮你找” windows系统给出的方案 1.进程创建时,windows系统为进程构造了一个句柄表 2.当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时 3.系统会将在句柄表中增加一个表项,表项的内容中存储了指向目标内核对象的指针 4.同时,系统返回这个表项在...

小花生编程 6807

C++ 什么是句柄?为什么会有句柄?HANDLE

出处:http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html 从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地...

一新新的小白的博客 8048

什么是句柄

【代码】什么是句柄

SXXYNHHXX的博客 3280

句柄

什么是句柄? 功能上的理解: 什么是"句柄"(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。 举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。 注意,这个号码是学校指定的,你无法自选。 有了这个号码(学生证,假设一证多用)享受学校提供的服务: 如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。 但你不能到食堂里买啤酒,因为学校...

MissLong的专栏 1905

句柄操作窗体_句柄理解及窗体句柄的应用

昨天小编只是在微头条随手发了一条关于句柄的内容,没想到居然很多人感兴趣,由于微头条的结构限制并不能很好的将句柄讲清楚,今天特地在这里将小编所掌握的关于句柄的知识分享给大家。句柄是什么我们先看权威的解释:句柄是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象或实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,...

weixin_42356073的博客 1689

句柄表及全局句柄

句柄表结构   1.这一块共计两个字节,低字节保留为0,高位字节是给SetHandleInformation这个函数用的,比如写成SetHandleInformation(Handle,HANDLE_FLAG_PROTECT_FROM_CLOSE,HANDLE_FLAG_PROTECT_FROM_CLOSE),那么这个位置将被写入0x02; HANDLE_FLAG_PROTECT_FRO...

Harlan的博客 3538

C++句柄

C++句柄 出处:http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html 概述 从广义上来说,能够从一个数值拎起一大堆数据的东西都可以叫做句柄句柄的英文是“Handle”,本义就是“柄”,只是在计算机科学中,被特别地翻译成“句柄”,其实还是个“柄”。 指针其实也是一种“句柄”,只是由于指针同时拥有更特殊的含义–实实在在地对应内存里的一个地址–所以,通常不把指针说成“句柄”,但指针也有着能从一个32位的值引出一大堆数据的

qq_28350219的博客 4307
上一篇: Snow White and the Seven Dwarfs
下一篇: 你喜欢自己吗?
sankt
博客等级 码龄22年 98粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值