句柄 订阅
句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量 [1]  。Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄 [1]  。 展开全文
句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量 [1]  。Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄 [1]  。
信息
定    义
标识对象或者项目的标识符 [1]
本    质
一种标识符 [2]
由    来
源于内存管理机制—虚拟地址 [1]
中文名
句柄 [1]
外文名
Handle [1]
领    域
数理科学 [1]
句柄简介
句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念。句柄一般是指获取另一个对象的方法——一个广义的指针,它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的惟一的联系 [3]  。在C++中,要访问一个对象,通常可以建立一个指向对象的指针。但是在很多具体的应用中,直接用指针代表对象并不是一个好的解决方案 [3]  。
收起全文
精华内容
参与话题
问答
  • 句柄

    多人点赞 2019-11-26 18:48:45
    句柄是 Windows 编程的基础,所谓句柄就是 Windows 使用的一种无重复整数。句柄主要用来标识应用程序中的一个对象,如窗口、实例、菜单、内存、输出设备、控制或文件等。 例如在模块文件定义文件中,菜单资源中的...

    句柄是 Windows 编程的基础,所谓句柄就是 Windows 使用的一种无重复整数。句柄主要用来标识应用程序中的一个对象,如窗口、实例、菜单、内存、输出设备、控制或文件等。

    例如在模块文件定义文件中,菜单资源中的菜单项被定义并且赋给了一个句柄值。应用程序的菜单栏中,第一个菜单的第一个菜单项可能被赋予 100 这个句柄值,那么第二个菜单项可能被赋予 101 这个句柄值。在应用程序的源代码中,这些菜单项将要通过 100 和 101 来区分。Windows 应用程序只能访问句柄,而不能直接访问句柄所指示的实际数据。Windows 系统控制着这些系统数据的存取权,这样才能在多任务环境中保护这些数据。Windows 常用的句柄见下表。

    Windows 常见的公用句柄类型
    句柄类型 说明 备注
    HBITMAP 保存位图信息的内存区域的句柄  
    HBRUSH 画刷句柄  
    HCTR 子窗口控件句柄

    ConTRol

    HCURSOR 鼠标光标句柄  
    HDC 设备描述表句柄 Device Context
    HDLG 对话框句柄 dialog
    HFONT 字体句柄  
    HICON 图标句柄  
    HINSTANCE 应用程序的实例句柄  
    HMENU 菜单句柄  
    HMODULE 模块句柄  
    HPALETTE 颜色调色板句柄  
    HPEN 在设备上画图时用于指明线型的笔的句柄  
    HRGN 剪切区域句柄  
    HTASK 独立于已执行任务的句柄  
    HWND 窗口句柄  

    句柄常作为 Windows 消息和 API(application programming interface,应用程序编程接口)函数的参数,在采用 API 方法编写 Windows 应用程序时要经常使用句柄。采用 MFC 方法编写 Windows 应用程序时,可以通过访问类的一个 public 的成员变量来获取某个 MFC 类对象的句柄,如 CWnd 类的成员变量 m_hWnd 就是一个窗口对象的句柄。由于对应的 MFC 类已经对句柄进行了封装,大多数情况下不在需要访问句柄。

    展开全文
  • 句柄

    2009-08-04 12:14:00
    1.句柄是什么? 在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄句柄也可以映射到唯一的对象。2.为什么我们需要句柄? 更准确地说,是windows需要句柄。windows需要向程序员...

    1.句柄是什么?
        在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯
    一的句柄,句柄也可以映射到唯一的对象。
    2.为什么我们需要句柄?
        更准确地说,是windows需要句柄。windows需要向程序员提供必要地编程接口
    ,在这些接口中,允许程序员访问、创建和销毁对象。但是,出于封装地考虑,wi
    ndows并不想向程序员返回指针。指针包含了太多的信息。首先指针给出了对象存储
    的确切位置;其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特
    征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作
    系统想向程序员隐藏的。
        如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操
    作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向
    你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,
    句柄封装方式实现了各取所需。
    3.句柄如何与对象映射?
        封装背后,必须有一个地方可以实现解码,以实现句柄和对象的相互转换。在
    windows中,存在两种映射方式:
        a. 全等映射。也即,句柄本身就是一个指针。映射在这里只是类型转换而已。
    这种情况有,进程实例句柄或模块句柄,以及资源句柄等等。
        b. 基于表格的映射。这是对象指针与句柄之间最普通的映射机制。操作系统创
    建表格,并保存所有要考虑的对象。需要创建新对象时,要先在表格中找到空入口
    ,然后把表示对象的数据添入其中。当对象被删除时,它的数据成员和其在表中的
    入口被释放。
    4.句柄的定义和实现
        我们以GDI对象为例进行讨论。创建了GDI对象,就会得到该对象的句柄。句柄
    的对象可能是HBRUSH、HPEN、HFONT或HDC中的一种,这依赖于你创建 的GDI对象类
    型。但是最普通的GDI对象类型是HGDIOBJ。HGDIOBJ被定义成空指针。
        HPEN的实际编译类型定义随编译时间宏STRICT的不同而不同。如果STRCIT已经
    被定义了,HPEN是这样的:
        struct HPEN__ {int unused};
        typedef struct HPEN__* HPEN;
        如果STRICT没有定义,HPEN是这样定义的:
        typedef void *HANDLE;
        typedef HANDLE HPEN;
        上面这段代码是一个注重细节的程序员最接近句柄的地方,因此我们重点分析
    一下。这里有一点点技巧。如果定义了STRICT宏,HPEN是指向有单个未使用字段的
    结构的指针,否则HPEN是空指针。C/C++编译器允许把任何类型的指针作为空指什传
    递,反之则不可以。两个不同类型的非空指针是互不兼容的。在STRICT版本中,编
    译对GDI对象句柄的不正确混用将给出警告,对于非GDI句柄,如HWND、HMENU的不正
    确混用也会给出警告,从而使程序在编译器得到更STRICT的检查。
        接下来的分析可能不那么令你感兴趣,但它更深刻地揭示了句柄。对GDI句柄来
    说,尽管windows头文件把它定义成指针,但如果你仔细检查这些句柄的值,它根本
    就不像指针,这也是为什么我说它只是一个32位无符整数值的原因。对句柄就是指
    针的情况,这句话也仍然适用。让我们随意地生成一些句柄,比如你用GetStockOb
    ject()以得到一些句柄,你会发现,它们的值总在区间0x01900011到0xba040389。
    前者指向用户区中的未分配的无效区域,后者指向内核地址空间。另外你可能发现
    ,两个句柄之间的值可能只差数值1,这也说明GDI句柄不是指针。
        和多数人想象的不一样,句柄也不是一个单纯的索引值。对GDI对象句柄来说,
    GDI句柄由8位 、1位堆对象标记(表明对象是否创建在堆中)、7位对象类型信息和
    高4位为0的16位索引组成,如图:
     3 3 2 2 2 2 2 2  2  2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
     1 0 9 8 7 6 5 4  3  2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    |  8 位引用计数 |堆 |  对象类型7  |            16位索引           |
                     标
                     记
    在这里你可以看到,对GDI来说,它只使用了16位作为索引。这意味着一个进程最多只
    可以创建小于64K个句柄,实际上受其他一些限制,整个windwos系统中大概可以容纳约
    16384(0x4000)个GDI对象。

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 48,898
精华内容 19,559
关键字:

句柄