两个问题。。。。
对象管理器。Windows 是以面向对象的方式设计的。窗口、设备、驱动、文件、互
斥体、进程和线程有一点是相同的,它们都被视为对象。对象管理器实现了管理任何类型对象
都需要的公共功能,这使得处理对象的任务变得容易了。对象管理器的主要任务如下:
1、申请和释放对象的内存。
2、维护对象命名空间。Windows 对象命名空间以树的形式组织,和文件系统目录结构
相同。对象名称由整个目录路径组成,对象管理器负责维护它的命名空间。不相关进程为了访
问一个对象,要首先使用这个对象的名称取得到它的句柄。
3、维护句柄。为了使用对象,进程打开这个对象,取回一个句柄。进程可以使用这个句
柄在此对象上执行日后的操作。每个进程有一个句柄表,它被对象管理器维护。句柄表不过是
一个指针数组,数组成员指向各对象;句柄仅仅是这个数组中的索引。当进程引用句柄时,对
象管理器就在句柄表中索引这个句柄,以取得真正的对象指针。
对于上面一段话有点不明白,“Windows 对象命名空间以树的形式组织” 比如窗口的对象不是在内存中创建吗?难道内存也有目录和跟目录这种东西?根目录是什么
“句柄表不过是一个指针数组,数组成员指向各对象;句柄仅仅是这个数组中的索引。” 句柄不是一个指针的指针吗,怎么会直接就指向对象呢
[解决办法]
关于句柄表的问题,他说的意思是句柄是数组的索引,通过这个索引来获得真正的对象,例如:*a[3] 索引为0、1、2 通过0来取得一个对象指针。句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
[解决办法]
句柄的话,你可以理解为指向指针的指针。
我自己的理解就是:句柄是指针或是索引,都只是一种称法,说到底就是一个标识,通过句柄这个,可以找到那个指向对象的指针。但是,不能直接通过句柄来得到对象。
[解决办法]
代码里的定义来看,句柄是个void*,是个指针;但在32位机器上指针就是一个32位的值,这个值实际上的意义是某个进程的句柄表的索引,使用这个索引可以访问内核对象(当然如果这个句柄是个内核对象的句柄的话);
像5楼所说,对于系统的内核对象、GDI对象,句柄的意义就像一把账户号码,反正你不能通过*hObject来访问。
具体的说明,有点复杂,你可以参考Windows核心编程第三章,有详细解释。