解码GDI对象句柄
今天都是在探索GDI内部的结构,在微软的文档中并没有系统的记载,虽然我觉得很有道理,但到底是不是这样只有微软自己知道了
。
(1)先看一下GDI句柄的定义,如HPEN是这样定义的
如果STRICT已经被定义了
struct HPEN_ {intunused;};
typedef struct HPEN_ * HPEN;
如果STRICT没有定义,HPEN是这样定义的
typedef void * HANDLE;
typedef HANDLE HPEN;
坦白的说,如果定义了STRICT宏,HPEN是指向有单个未使用字段的结构的指针,否则HPEN是空指针。
。。。。。。。。然后本书作者经过一系列的探索,利用了一个复杂的程序,列出的GDI中部分句柄的一些信息,如内存地址,函数
名和序列。。。。。。
总之,最后得出了一些结论(根据内存地址)
32位的GDI句柄由8位未知的高位、1位堆对象标记、7位对象类型信息和高4位是0的16位索引组成。借助7位对象类型信息,可以确定
设备上下文、区域、位图、调色板、字体、画刷、加强型图元文件、画笔和扩展画笔。
如下图