当前位置: 首页 > news >正文

什么是句柄?(转载)

先来看些权威的片断:
...
typedef unsigned int HANDLE;
#define DECLARE_HANDLE(name) typedef UINT name

DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
...
#define DECLARE_HANDLE(x) typedef WORD x
...
//+-------------------------------------------------------------------------
// DECLARE_HANDLE Macro
//--------------------------------------------------------------------------
#ifndef DECLARE_HANDLE
#define DECLARE_HANDLE(name) \
struct name##__ { DWORD unused; }; \
typedef struct name##__ _far* name
#endif
...

知道本质了吧~~~~

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


在<<WINDOWS编程短平快>>(南京大学出版社)一书中是这么说的:句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

从上面的2个定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述表句柄),HICON(图标句柄)等等,这当中还有一个通用的句柄,就是HANDLE,比如下面的语句:

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2句语句都是对的。

一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多API函数,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。另外,WINDOWS也能通过应用程序的引出函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行操作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。

句柄只有当唯一的确定了一个项目的时候,它才开始有意义。句柄对应着项目表中的一项,而只有WINDOWS本身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄,举个例子来说吧!比如:我们可以为我们的应用程序申请一块内存块,通过调用API函数GlobalAlloc,来返回一个句柄值:

hMem=GlobalAlloc(......);

其实现在hMem的值只是一个索引值,不是物理地址,应用程序还不能直接存取这块内存。这儿还有一个话外题,就是,一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块内存的地址是不确定的,因为他是可以移动的,所以得先锁定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。如下:

lpMem=GlobalLock(hMem);

这样应用程序才能存取这块内存。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 完美解决ubuntu中所有文将夹下内容被加锁的问题
  • 在BCB中使用VCL控件数组
  • ubuntu20.04给jupyter notebook安装自动补全代码语法的插件工具
  • 几天猎头生活的感想(转载)
  • 如何在ubuntu20.04系统中用gcc编译运行一个C程序?
  • 完美解决ubuntu2020.04的gcc编译环境下出现报错:undefined reference to `sin‘的问题
  • 目标检测YOLO系列算法精讲:从yolov1至yolov4的进阶之路(呕心沥血2万字超全整理,建议收藏!)
  • 程序员的激情与冲动.
  • 最全tensorflow,PyTorch ,numpy和keras 版本匹配汇总
  • 完美解决Ubuntu16.04下配置vs code编译环境
  • Dell 电话技术支持工程师答用户问(转载)(暴笑)
  • 完美解决在Windows下Vs Code编译不同C函数之间的调用问题
  • C++结构体可放在函数内部和外部
  • 程序员——[小鸟语录]
  • Matlab使用笔记(九):matlab实现交通流仿真/车感知/城市交通交叉路口
  • [译]Python中的类属性与实例属性的区别
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 10个确保微服务与容器安全的最佳实践
  • conda常用的命令
  • co模块的前端实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • echarts花样作死的坑
  • HashMap ConcurrentHashMap
  • isset在php5.6-和php7.0+的一些差异
  • Java 网络编程(2):UDP 的使用
  • Linux Process Manage
  • storm drpc实例
  • Vim 折腾记
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 编写符合Python风格的对象
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 工作手记之html2canvas使用概述
  • 机器学习 vs. 深度学习
  • 蓝海存储开关机注意事项总结
  • 前端存储 - localStorage
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 我的业余项目总结
  • 优化 Vue 项目编译文件大小
  • 【干货分享】dos命令大全
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Linux(Source Insight安装及工程建立)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (poj1.3.2)1791(构造法模拟)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)Flink Join 连接
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)visual stdio 书签功能介绍
  • .net CHARTING图表控件下载地址