我的理解:
windows系统有一个名词叫"资源",比如窗口、菜单等都构成资源,确切地说它们是消耗资源(这个资源是指硬件)的东西,以菜单为例,系统为了显示一个菜单,它得在内存中开辟一定的空间,其中是对菜单的描述,包括每个子项的文本、ID、状态等内容。Windows系统一旦启动,内存中就有好多这样的东西在占用系统资源,Windows要对它们进行管理,比如内存不够的时候,它得决定把那些东西暂时先从内存搬出去。系统要访问这些东西,怎么找到它们呢?系统为它们每人分配一个号(保证唯一),这就是句柄了。刚开始的时候搞不清句柄和指针的关系:比如对于一个窗口,有一个句柄和一个指针(当然是CWin类的指针)与之相对应,它们有什么区别呢?句柄和指针是两个不同世界的概念。句柄是系统级的,与编程无关,它只管访问到必要的信息;指针是编程领域内的事(我是特指上面提到的CWin类指针),通过该指针,可以对窗口或其它什么东西进行必要的操作,比如 ->MoveWindows(…); 其实如果你能搞清楚Windows对象和C++对象之间的联系和区别就很好理解这一点了。前面所说的在内存中存放的对菜单的描述就是所谓Windows对象了;为了操作它,VC程序会先构筑一个相应的C++对象,如CMenu对象。
windows系统有一个名词叫"资源",比如窗口、菜单等都构成资源,确切地说它们是消耗资源(这个资源是指硬件)的东西,以菜单为例,系统为了显示一个菜单,它得在内存中开辟一定的空间,其中是对菜单的描述,包括每个子项的文本、ID、状态等内容。Windows系统一旦启动,内存中就有好多这样的东西在占用系统资源,Windows要对它们进行管理,比如内存不够的时候,它得决定把那些东西暂时先从内存搬出去。系统要访问这些东西,怎么找到它们呢?系统为它们每人分配一个号(保证唯一),这就是句柄了。刚开始的时候搞不清句柄和指针的关系:比如对于一个窗口,有一个句柄和一个指针(当然是CWin类的指针)与之相对应,它们有什么区别呢?句柄和指针是两个不同世界的概念。句柄是系统级的,与编程无关,它只管访问到必要的信息;指针是编程领域内的事(我是特指上面提到的CWin类指针),通过该指针,可以对窗口或其它什么东西进行必要的操作,比如 ->MoveWindows(…); 其实如果你能搞清楚Windows对象和C++对象之间的联系和区别就很好理解这一点了。前面所说的在内存中存放的对菜单的描述就是所谓Windows对象了;为了操作它,VC程序会先构筑一个相应的C++对象,如CMenu对象。
解决方案 »
- clist 双击空白的问题
- 怎么将模拟键盘事件不占用键盘资源??
- 线程中使用COMM口的问题
- 求救:使用CHttpFile的OpenRequest出错(50分)
- 对话框调用消息函数的问题
- 关于 链表线程 问题(菜鸟)
- ------不是很难的问题---------简直是送分--------
- 现在问一个也是关于settimer和sleep的问题。
- ************怎样给CRichEditView加入背景*************
- Windows 下recv() 和Linux下的recv()是不是一样?
- ????再问鼠标在屏幕上捕词的问题??????
- 哪有Inside_com 的配书源码下载啊?
你可以在VC6里查一查handle的定义,是unsigned long,说白了就是相当于学号的东东。系统规定你的资源是第几号就分给你一个相应的资源ID(学号),这就是handle了。
窗体?记不清了,是不是指的Frame?如果是那就是指你的应用程序的编框了,呵呵:)。
回复人:kxy(小康) (2000-3-11 20:58:00) 得0分
已答问题中有
回复人:lu0() (2000-3-12 17:54:00) 得0分
一个OS才理解的值.可能为指针,或数值或其他.
是作为便于OS自身运作而存在的一个东东.
回复人:Shania() (2000-3-16 11:13:00) 得30分
句柄是windows为了充分利用内存而引入的一个机制,在32位系统中,它是一个32位的unsigned int;其中保存了一些有关内存地址的信息;它类似于指针但又和指针不同,
大家都知道指针代表了一个内存地址,用于标始一块内存。在windows中,内存块是可移动的(优化内存的使用),所以我们在使用内存时,当内存发生移动时,原来的指针值代表的内存已经发生了变化。所以windows引入了句柄的概念。句柄值不会变,指针值会变(内存块移动)。
看了下面的例子你就会明白一点://申请内存,得到唯一句柄值。
HGLOBAL handle = GlobalAlloc(..,..);//锁定内存块,不让它移动,这样用户就
//可以通过指针来使用内存块,而不致于由于内存块的移动,而导致指针无效。
char* ptr = (char*)GlobalLock(handle);
//use the memory you alloced;such as;
*ptr='h';GlobalUnlock(handle);//用好后,内存块解锁,允许移动。
GlobalFree(handle);//如果不再需要内存,释放它。其实象HWND,HBRUSH,HDC,....等等句柄,它们代表的都是一块有特定内容的内存块!
回复人:gaoxiaofeng() (2000-3-16 12:53:00) 得0分
我也是初学者,我这样体会:句柄类似于指针,不过指针读的是某些变量,而句柄是读取某些object所用。需要用它来获得对应于各类的变量(如窗口、滚动条、对话框等)。我的一点个人感受。
回复人:ZPoint() (2000-3-16 20:46:00) 得0分
简单地说,句柄就是你定义的对象的指针,你可以在它销毁之前任意地使用它。
回复人:jinnie() (2000-3-23 14:20:00) 得0分
我感觉句柄比较稳定、安全,存在的时期较长。就象字符指针对于字符数组一样。字符指针得分配内存,字符数组是系统分配的临时变量。不过,句柄得删除,不然,会造成内存泄漏。
回复人:sunsetyang() (2000-3-23 15:02:00) 得0分
比较通俗一点的说:句柄就是一种利于系统作封装处理的数据结构。它的封装有利于向用户隐藏实现上的细节。它的维护由系统统一维护,有利于维护程序的健壮性。
回复人:laole() (2000-3-23 17:06:00) 得0分
呵呵,如果把对象和人相比,你可以把句柄理解为身份证。
它是随对象的生成而产生,随对象的销毁而消灭。任何时
候只有知道了对象的句柄,就可以找到对象。
回复人:Hongshu(鸿哥) (2000-3-24 11:00:00) 得0分
句柄就是指向内存块的地址
回复人:tianshu() (2000-3-27 19:34:00) 得0分
不同的句柄有不同的含义
比如HMODULE是IMAGE的基地址 回复贴子:
回复人:breath(跨马倚斜桥,满楼红袖招) (2000-11-14 12:12:00) 得0分
就是一个指针
在32位windows中占用4个字节
它指向内存的尺寸由它的类型决定函数用句柄来传递数据
回复人:andygood() (2000-11-14 12:22:00) 得20分 句柄在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分以下的题目。:)
回复人:jiujiejushi(九戒居士) (2000-11-14 14:36:00) 得0分
句柄是对象的索引,这样隐藏了危险的地址信息,同时也使系统对象和应用程序隔离。
回复人:ddddh(叶君临) (2000-11-14 15:00:00) 得0分
句柄,你可以把他想象成一个把子,让别人来拎的把子.至于怎么来拎,是操作系统的事情句柄不是指针,作为内核对象他是系统一个内核对象指针的索引.可以间接的认为他是指针的指针.呵呵,说不清楚,关键是不同的句柄,有不同的处理方法
你需要知道的是如何得到一个句柄,然后保存他,在需要的地方把他作为参数传给函数就可以了,具体是什么其实不需要知道:)
回复人:ddddh(叶君临) (2000-11-14 15:18:00) 得0分
倒,发了这么多遍,非我本意!
nnd csdn...............
回复人:andygood() (2000-11-14 17:23:00) 得0分 在32位Windows中,“句柄不是指针”这句话已经不再成立了,比如GlobalAlloc()等内存分配函数返回的句柄实际就是该内存的地址。因此才不需要使用GlobalLock()来锁定句柄以得到地址。这些东西n年以前在MSDN中就说明了。 事实上,有实际对象意义的东西(占用一段存储器),比如上面说的内存的句柄基本就是地址。其它没有对象意义的东西是系统索引。这些你只要看看Windows的那几个头文件就能理解了。 说句题外话,如果没有看过Windows标准头文件和MFC源程序就不能算是真正的Windows程序员。撑死是一个合格的c/c++程序员。
我觉得作为初学者,对于句柄不需要了解太深 。许多人把句柄说成“似于指针又非指针”,我看的一本国外人编的书,说句柄是“指向指针的指针”,因为WINDOWS竟长作一些内存操作而不通知应用程序,使用指针的话,会产生许多悬挂的指针,理解到这一步就可以了。
至于AOI嘛,我也是从API 学起的,你可以看看我们老师编的书,清华大学出版社,该书大半部分讲API,小部分讲MFC,我觉得还行