引用和指针-面试题38-什么是句柄

1:句柄在Windows编程中是一个很重要的概念,在许多地方都扮演着重要的角色。在Windows环境中,句柄是用来标识项目的,这些项目包括:

(1)模块(module)

(2)任务(task)

(3)实例(instance)

(4)文件(file)

(5)内存块(block of memory)

(6)菜单(menu)

(7)控制(control)

(8)字体(font)

(9)资源(resourse),包括图标(icon)、光标(cursor)、字符串(string)等。

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

2:Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。由于地址总是如此变化,所以Windows操作系统为各应用程序腾出了一些存储地址,用来专门登记各应用对象在内存中的地址变化,而这地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装在(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

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

    句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象。但是必须注意的是,程序每次重新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况下的确是不一样的。

posted @ 2017-10-09 21:37  一串字符串  阅读(425)  评论(0编辑  收藏  举报