关于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出来。
[解决办法]
[解决办法]
[解决办法]
句柄是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通过对象的索引找到对象的内存地址.
每个进程都会维护这样一个句柄数据表,所以相同的句柄值,到了另一个进程中就会关联到另一个内核对象.这就是句柄跨进程访问需要注意的问题.