句柄的本质——拨乱反正篇

原创 2001年09月19日 10:29:00

受M$的帮助文档以及很多Windows编程书籍的影响,大家对局柄比较普遍的认识是:句柄是一个整数,用以标识Windows对象,句柄不是一个指针……

而实际上,这些不过是M$进行数据封装的幌子而已,下面我们一起来分析一下HANDLE到底是什么。

请先到Windef.h找绝大多数句柄的定义:
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HHOOK);
……
DECLARE_HANDLE(HGDIOBJ);
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
……
typedef HANDLE              HGLOBAL;
typedef HANDLE              HLOCAL;
……

OK, 现在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什么:
#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
typedef HANDLE *PHANDLE;

哈哈,现在知道了吧,HANDLE就是PVOID,也就是无类型指针,
而DECLARE_HANDLE(HWND);就是:
struct HWND__ {
    int unused;};
typedef struct HWND__ *HWND;
现在实际上都清楚啦,这些Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,^o^

现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么,而且可以编个句柄的瞎话防止大家的质疑:)。而M$的程序大可以这么写:
#include <windows.h>  //这个和大家用的一样
#include "windows_in.h"  //这个是M$自用的,外人别想看到^o^

HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {
    struct RealSomething* p = (struct RealSomething*)hSomething; //先强制类型转换成内部结构指针
    ……do something……
    return (HSOMETHINGELSE)pRealSomethingElse;//强制类型逆转换
}

^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^ 

对句柄本质的探讨

对句柄的认识 之前在编写MFC程序的时候,有时会碰到句柄这一概念,由于对它一直不是很重视,所以并没有主动去了解它.随着不断深入学习MFC,特别是看完候先生的>后,对句柄的实质产生了很大的兴趣,于是到处...
  • wangjiwei2010
  • wangjiwei2010
  • 2006年11月24日 17:05
  • 1455

句柄的本质/句柄是什么

句柄的本质一、书上定义:>(Microsoft Press,by Richard Wilton)    在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task...
  • pengwentao
  • pengwentao
  • 2011年06月30日 16:29
  • 2242

句柄本质

在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 (instance)、文件(file)、内存块(block of memory)、菜单(men...
  • camly
  • camly
  • 2007年09月09日 16:30
  • 421

进程模块句柄

一、注意区别进程模块句柄和进程内核句柄 二、每个可执行文件或者DLL文件被装入到某个进程地址空间后,都会有一个唯一的实例句柄,来表示装入后的可执行文件或者DLL,此时我们把这个可执行文件或者DLL...
  • jadeshu
  • jadeshu
  • 2017年05月28日 23:42
  • 440

句柄的本质

一、书上定义:>(Microsoft Press,by Richard Wilton)    在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 ...
  • vargas
  • vargas
  • 2006年08月03日 17:38
  • 854

004_句柄表及句柄的本质

进程内核对象R0 句柄表(查不到,不希望暴露) 索引 (就是句柄) 指向内核对象的指针(真真正正指向内核对象的指针) 标识位 启动一个 File Obj ...
  • w739639550
  • w739639550
  • 2017年07月03日 11:29
  • 48

拨乱反正

在剩下的一年多的时间里,自己得给自己赚点钱 锻炼一下自己,一定得去外面多转转!明年到校本部后就得给自己锻炼的机会!基础一定要深入内核分析,自己的以后就得往深入的去学习了!内核级别的在大学里 还得学会要...
  • henoch
  • henoch
  • 2008年11月22日 14:46
  • 132

句柄的本质(整理-收藏)

一、书上定义:>(Microsoft Press,by Richard Wilton)    在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 ...
  • feijj2002_
  • feijj2002_
  • 2005年08月28日 00:19
  • 2838

对句柄本质的探讨

转自:http://blog.163.com/wu_w_s/blog/static/3521321320086335952964/ 对句柄本质的探讨 我觉得自己对于指针理解比较透彻了,但关于句柄的理解...
  • zhangxuejie
  • zhangxuejie
  • 2009年10月24日 10:27
  • 208

程序员应具备的素质-拨乱反正篇

程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立,到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数据营销平台的搭建,程序员在里面都扮演着举足...
  • llxchen
  • llxchen
  • 2011年04月18日 14:56
  • 1014
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:句柄的本质——拨乱反正篇
举报原因:
原因补充:

(最多只允许输入30个字)