- UID
- 41172
注册时间2007-12-14
阅读权限30
最后登录1970-1-1
龙战于野

TA的每日心情 | 开心 2022-4-18 15:36 |
---|
签到天数: 207 天 [LV.7]常住居民III
|
每一个进程都有一个句柄列表数组,由Windows管理,比如你GetStockObject后,Windows还是会拷一份到你的进程中,但是再次GetStockObject同一个,是直接返回已经存在的索引,注意是索引,比如,你打开一个文件,成功你会发现返回值是一个立即数,比如15,这就是当前句柄数组中这个物件的索引,Windows在操作句柄时,比如使用ReadFile,hFile,这个hFile是15,Windows读取句柄列表中第15个元素,如果为空,返回失败,成功,再去操作对应的地址.而Windows在退出时会扫描这个句柄数组,将它们全部释放.几乎所有的句柄都是在这个数组中的,只不过每一个元素都有一个结构体,表示是文件句柄/线程句柄/GDI等等。
而CreateClipRgn,这个函数前是Create而不是Get,那么必须删除,否则会有资源泄漏。
而GetStockObject/LoadBitmap/LoadIcon之类,在第一次使用时会分配内存返回句柄,之后则是直接返回的。所以不需要删除,你要删除也是可以的,不过删除后下次又会分配/载入,浪费运行时间。
所以,句柄其实是句柄数组中的索引,而对应索引中的元素才是保存地址的一个标识对象的结构体。
这就是句柄.. |
|