关于Windows句柄,该如何解决
关于Windows句柄在Windows里有各种各样的句柄,比如什么HDC,HBITMAP,HWND,等。有时我们访问一个句柄的内存时
关于Windows句柄 在Windows里有各种各样的句柄,比如什么HDC,HBITMAP,HWND,等。有时我们访问一个句柄的内存时,却出现UNHANDLED EXCEPTION的错误,不知道是什么原因。What the structure of the certain HANDLE , in other word ,what's the secratory hiden in it ?[解决办法] 所谓句柄是一个标识windows资源(如菜单,图标,窗口等)和设备等对象的变量 ,或者是一个对操作系统资源的间接引用。 最后一句提到了是对系统资源的间接引用,我们可以把它理解为是一个指针(实际上不是) 它所指向的是存储系统资源的结构,我们通过它可以操作这些资源。 如 通过HBITMAP HDC 我们就可以在窗体上显示位图[解决办法] 句柄又不是指针,访问一个句柄的内存毫无意义,至于如何由句柄找到相关的对象,那是操作系统的事情。[解决办法] 句柄是一个标志,这个标志只有微软知道使用,就好比你用数组的时候,用0,1,2,3,4……来表示数组的索引,这个时候,数组的下标就是一个标志,你可以控制你的数组,句柄也如此,只有通过这个标志,你可以操作对应的那个窗口,进行画图操作等等。[解决办法] 句柄应该不是指针,至少不是通常意义上的指针,因为我们无法象常用指针那样访问它。但是它与指针确实有很多相似的地方,比如当你用指定的API访问,或采用指定结构进行转换时就能成功。这些问题的原因只有MS才知道,而WIN是不开源的,这一点大家都知道,所以在这里瞎猜也就没什么意义,除非你打算设计一款类似的OS出来。[解决办法]
探讨 引用: 你怎么知道不是?难道访问失效就不是了? 有的时候是,有的时候不是。#8说得略微有点一棍子打死:“句柄不可能是地址”,句柄的值有的时候和地址的值是一样的,不过情况并不多,而且是一些“伪句柄”,比如HMODULE。 你访问对象的时候通过句柄就好,不用自己去考虑对应的地址。如果你硬要获得对应的地址,那么可以到句柄表ObjectTable 里面去看[解决办法] 探讨 引用: 引用: 你怎么知道不是?难道访问失效就不是了? 有的时候是,有的时候不是。#8说得略微有点一棍子打死:“句柄不可能是地址”,句柄的值有的时候和地址的值是一样的,不过情况并不多,而且是一些“伪句柄”,比如HMODULE。 你访问对象的时候通过句柄就好,不用自己去考虑对应的地址。如果你硬要获得对应的地址,那么可以到句柄表ObjectTable 里面去看 承认错误,不过据我所知,句柄就是地址的例子好像只有HMODULE这一个了,另外,有一位大牛曾经说MS的文档中从来没有说过HMODULE这个代表进程的地址,虽然从实验的角度看它确实是地址,但是不能代表MS在后续版本中不会改变它。 呵呵 我是这么想的:所谓的句柄,确实是指针。仿佛系统创建句柄都在受保护的系统区域内定义的数据结构。所以虽然指针不空(!NULL),但是我们一访问就跳入了空指针的陷阱.(TRACK)。这是他们(...)实现的一种保密机制。 =========================================================== 我不认为句柄是指针的一个原因是将句柄的值用整型数打印出来的话,都是一些数值比较小的数,如果是地址的话,32位寻址的地址值应该不会是一些小数值,所以我更倾向于认为句柄是系统维护的一个表的索引序号。[解决办法] 句柄是windows对对象(资源占大多数)描述的一个索引号,可以理解成windows对你的程序建了一个的数据库,每一条记录中ID号为句柄,对象和ID属于同一条记录。所以可以通过句柄直接查询到你的对象。
句柄的类型是Void*,有专门的函数来通过句柄获取对象,或者通过对象得到它的句柄。例如得到窗口句柄HWND hwnd = pwnd->m_hwnd; 通过句柄得到对象CDialog *pCob = (CDialog *)CWnd::FromHandle(hWnd);
参考微软的文章http://msdn.microsoft.com/en-us/library/c251x6s1.aspx
[解决办法] 句柄的确切含义,到目前为止MS依然没有公布.不过从现有的实验和资料猜想来看,句柄是一个"间接指针".每一个进程维护着一个数据表,其中按照一一映射的方式保存着内核/用户对象(信号量,互斥对象,线程控制块,管道,GDI...)的内存地址,该对象的索引,安全属性描述字段,继承属性描述字段等.而句柄就是
对象的索引 ,OS通过对象的索引找到对象的内存地址.
每个进程都会维护这样一个句柄数据表,所以相同的句柄值,到了另一个进程中就会关联到另一个内核对象.这就是句柄跨进程访问需要注意的问题.