61阅读

句柄是什么意思-编程中句柄的意思是什么

发布时间:2018-05-06 所属栏目:句柄无效是什么意思

一 : 编程中句柄的意思是什么

所谓句柄实际上是一个数据,是一个Long (整长型)的数据。 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。 如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢? 为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象 本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。 但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

其他回答共2条

2011-4-7 08:31doublejiang2|四级

你可以认为是一个class,也可以设为是一个指针之类的东西。很多api需要的参数,这个参数不正确,api就不能工作。其实是一个offset。 0

|评论

2011-4-7 08:40hedogn|六级

就像每一个计算机要分配一个ip地址,学校中每一个学生都一个学号一样,操作系统识别管理资源的依据就是句柄。对操作系统来说,要指定一个功能,你一般要指定该操作是针对那个窗口或资源而言的,如果一个程序的某个窗口在屏幕上出现了好几个,因为他们的代码都一样,那么识别它们的唯一依据就是句柄(句柄是操作系统分配的唯一数字编号)。

最佳答案此答案由提问者自己选择,并不代表爱问知识人的观点

揪错┆评论

wang_zhenzhu

[学者]

在WINDOWS操作系统中,每一个对象都有一个唯一的编号,这个编号就叫句柄,这就好像每个人都有一个名字一样,用以被别人称呼或识别。句柄是给编程的人用的,以便程序员在程序中使用、称呼这个对象。

回答:2006-03-18 13:13

提问者对答案的评价:    

其它回答共1条回答

评论



dsqian01

[学妹]

句柄在WIN32下就是一个32位整数。它是WINDOWS用来记录,控制所分配资源的一个控制点。它的英文HANDLE(把手,把柄),可能更能使人明白。比如生成一个窗口,会返回一个窗口句柄。从资源中读入一幅位图,会返回一个位图句柄。获得了句柄,我们可以用它做许多事。比如用GETOBJECT可以返回WINDOWS中所有有关图形GDI资源的信息。在GETOBJECT中传入位图句柄及位图结构变量,可返加位图的有关信息。有窗口句柄,就可以控制这个窗口的类型,大小等多个方面。API就是应用程序编程接口。可以理解为就是系统为我们提供的函数。只要WINDOWS存在,我们就可以对它提供的函数进行调用。

参考文献:CSDN社区

回答:2006-03-18 12:53

二 : 句柄是什么意思啊?我就是理解不了,能帮帮我吗?

句柄是什么意思啊?我就是理解不了,能帮帮我吗?


在WINDOWS操作系统中,每1个对象都有1个唯一的编号,这个编号就叫句柄,这就好像每个人都有1个名字一样,用以被别人称呼或识别。句柄是给编程的人用的,以便程序员在程序中使用、称呼这个对象。

三 : 句柄到底是什么意思?!

就是一个指针

在32位windows中占用4个字节

它指向内存的尺寸由它的类型决定

函数用句柄来传递数据

句柄在winnt.h中是这么定义的:

#ifdef STRICT

typedef void *HANDLE;

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

#else

typedef PVOID HANDLE;

#define DECLARE_HANDLE(name) typedef HANDLE name

#endif

STRICT修饰符的意思是变量类型是否要求严格定义。在这里,我们可以看到HANDLE其实就是一个void类型的指针。这样有什么用呢?学过c/c++语言的人都知道,void类型的指针可以通过强制类型转换变为任何类型的指针,使用最灵活。

在很多情况下,句柄是一个对象的指针,或者说是地址,一个对象的地址。比如对于分配的一个内存块(对象),它的句柄就是它的首地址,这没什么问题。

但是这并不总是成立的,对于没有对象意义的句柄尤其如此。这就取决与系统的定义了。比如系统钩子的类型HHOOK,说它是地址就没有任何意义。对于窗口句柄也是如此。在这些情况下,我们可以把句柄理解为某事物在系统该类事物列表中的ID。

是不是加点分呀?我从来没回答过50分以下的题目。:)

句柄是对象的索引,这样隐藏了危险的地址信息,同时也使系统对象和应用程序隔离。

句柄,你可以把他想象成一个把子,让别人来拎的把子.至于怎么来拎,是操作系统的事情

句柄不是指针,作为内核对象他是系统一个内核对象指针的索引.可以间接的认为他是指针的指针.

呵呵,说不清楚,关键是不同的句柄,有不同的处理方法

你需要知道的是如何得到一个句柄,然后保存他,在需要的地方把他作为参数传给函数就可以了,具体是什么其实不需要知道:)

在32位Windows中,“句柄不是指针”这句话已经不再成立了,比如GlobalAlloc()等内存分配函数返回的句柄实际就是该内存的地址。因此才不需要使用GlobalLock()来锁定句柄以得到地址。这些东西n年以前在MSDN中就说明了。

事实上,有实际对象意义的东西(占用一段存储器),比如上面说的内存的句柄基本就是地址。其它没有对象意义的东西是系统索引。这些你只要看看Windows的那几个头文件就能理解了。

说句题外话,如果没有看过Windows标准头文件和MFC源程序就不能算是真正的Windows程序员。撑死是一个合格的c/c++程序员。

四 : 句柄到底是什么意思?!

就是一个指针

在32位windows中占用4个字节

它指向内存的尺寸由它的类型决定

函数用句柄来传递数据

句柄在winnt.h中是这么定义的:

#ifdef STRICT

typedef void *HANDLE;

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

#else

typedef PVOID HANDLE;

#define DECLARE_HANDLE(name) typedef HANDLE name

#endif

STRICT修饰符的意思是变量类型是否要求严格定义。在这里,我们可以看到HANDLE其实就是一个void类型的指针。这样有什么用呢?学过c/c++语言的人都知道,void类型的指针可以通过强制类型转换变为任何类型的指针,使用最灵活。

在很多情况下,句柄是一个对象的指针,或者说是地址,一个对象的地址。比如对于分配的一个内存块(对象),它的句柄就是它的首地址,这没什么问题。

但是这并不总是成立的,对于没有对象意义的句柄尤其如此。这就取决与系统的定义了。比如系统钩子的类型HHOOK,说它是地址就没有任何意义。对于窗口句柄也是如此。在这些情况下,我们可以把句柄理解为某事物在系统该类事物列表中的ID。

是不是加点分呀?我从来没回答过50分以下的题目。:)

句柄是对象的索引,这样隐藏了危险的地址信息,同时也使系统对象和应用程序隔离。

句柄,你可以把他想象成一个把子,让别人来拎的把子.至于怎么来拎,是操作系统的事情

句柄不是指针,作为内核对象他是系统一个内核对象指针的索引.可以间接的认为他是指针的指针.

呵呵,说不清楚,关键是不同的句柄,有不同的处理方法

你需要知道的是如何得到一个句柄,然后保存他,在需要的地方把他作为参数传给函数就可以了,具体是什么其实不需要知道:)

在32位Windows中,“句柄不是指针”这句话已经不再成立了,比如GlobalAlloc()等内存分配函数返回的句柄实际就是该内存的地址。因此才不需要使用GlobalLock()来锁定句柄以得到地址。这些东西n年以前在MSDN中就说明了。

事实上,有实际对象意义的东西(占用一段存储器),比如上面说的内存的句柄基本就是地址。其它没有对象意义的东西是系统索引。这些你只要看看Windows的那几个头文件就能理解了。

说句题外话,如果没有看过Windows标准头文件和MFC源程序就不能算是真正的Windows程序员。撑死是一个合格的c/c++程序员。

五 : c++中的句柄是什么意思,如何理解?

c++中的句柄是什么意思,如何理解?

请通俗的解释一下

c++中的句柄是什么意思,如何理解?的参考答案

所谓句柄实际上是一个数据,是一个Long (整长型)的数据.

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.WINDOWS句柄有点象C语言中的文件句柄.

从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人.从数据类型上来看它只是一个16位的无符号整数.应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象.

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

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的.Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存.这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置.这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统.

句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象

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

但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的.假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理.

本文标题:句柄是什么意思-编程中句柄的意思是什么
本文地址: http://www.61k.com/1139053.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1