我从其他资料看到,句柄实际上是指向指针的指针,Windows是一个以虚拟内存为基础的操作系统,在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,所以在程序运行过程中对象的地址会不断变化,所以才使用句柄来保存对象的地址。但有一点我不明白,我们在程序中有时使用句柄,有时使用指针。按照上面的说法我们所引用的指针(比如CWnd*,CButton*之类的)可能会指向其他不明的地址。这该怎么解释呢?我是一个刚接触Windows程序设计的新手。希望大家帮帮我。多谢了
调试欢乐多
句柄是操作系统对自己维护的资源的一种描述。指针是一个值,它的大小是看CPU的字长的,也就是说CPU的寻址能力决定了指针的最大范围,所以说指针是描述计算机内存某个位置的一个变量。
在Win32内核下(Win9X & ME)句柄确实和指针有一定的联系,有人甚至还说它们相互之间是等效的,虽然这种说法不太严谨,呵呵。(其实就算是Win95 ,98, ME它们三者之间的HANDLE也都是不能互通的),
而到了NT内核下(WinNT, 2000 & XP & 2003)句柄就和指针没有半点干系了,可能是微软觉得以前那样不安全吧,反正是变成了只有它们自己才能解释的东西了,我们研究它也没多大意义。
指针是针对当前进程而言的,当前进程的指针是不会指到别的进程里面去的,比如同样的0xffffffff,在不同进程里面指向的目标是不一样的
句柄是操作系统级别的概念,在操作系统范围内是唯一的
mywnd->GetSafeHwnd() or mywnd->m_hWnd; 区别是前一个会判断是否是有效句柄,无效返回NULL句柄获得指针
CWnd::FromHandle(hwnd);id->指针 CWnd::GetDlgItem();句柄到id
id = GetWindowLong(hWnd,GWL_ID);指针到ID的就
id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);id->句柄
hWnd = ::GetDlgItem(hParentWnd,id);HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
HWND 是一个窗口的句柄,你可以理解为一个极大的整数,可以唯一识别系统中的所有窗口。CWnd *则是指向窗口对象的一个指针。一个窗口对象会有许多属性,包括其句柄hwnd,还有一些成员函数,消息处理函数等。
一个是句柄,用于标识,访问窗口对象
一个是指针 指向一个窗口对象