我从其他资料看到,句柄实际上是指向指针的指针,Windows是一个以虚拟内存为基础的操作系统,在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,所以在程序运行过程中对象的地址会不断变化,所以才使用句柄来保存对象的地址。但有一点我不明白,我们在程序中有时使用句柄,有时使用指针。按照上面的说法我们所引用的指针(比如CWnd*,CButton*之类的)可能会指向其他不明的地址。这该怎么解释呢?我是一个刚接触Windows程序设计的新手。希望大家帮帮我。多谢了

解决方案 »

  1.   

    这要根据不同的操作系统来看待的,句柄(HANDLE)是微软搞出来的一个东西,而指针(Pointer)是自打有了第一个CPU就有的东西了。
    句柄是操作系统对自己维护的资源的一种描述。指针是一个值,它的大小是看CPU的字长的,也就是说CPU的寻址能力决定了指针的最大范围,所以说指针是描述计算机内存某个位置的一个变量。
    在Win32内核下(Win9X & ME)句柄确实和指针有一定的联系,有人甚至还说它们相互之间是等效的,虽然这种说法不太严谨,呵呵。(其实就算是Win95 ,98,  ME它们三者之间的HANDLE也都是不能互通的),
    而到了NT内核下(WinNT, 2000 & XP & 2003)句柄就和指针没有半点干系了,可能是微软觉得以前那样不安全吧,反正是变成了只有它们自己才能解释的东西了,我们研究它也没多大意义。
      

  2.   

    但有一点我不明白,我们在程序中有时使用句柄,有时使用指针。按照上面的说法我们所引用的指针(比如CWnd*,CButton*之类的)可能会指向其他不明的地址。这该怎么解释呢?=============>
    指针是针对当前进程而言的,当前进程的指针是不会指到别的进程里面去的,比如同样的0xffffffff,在不同进程里面指向的目标是不一样的
    句柄是操作系统级别的概念,在操作系统范围内是唯一的
      

  3.   

    to bobob(静思--潜心研究PDF)你这不挺明白的麽,干吗装犊子呀?!
      

  4.   

    楼主去看WINDOWS核心编程这本书,写的很清楚地。
      

  5.   

    呵呵,我正好看了前4章的WINDOWS核心编程,是够清晰
      

  6.   

    指针到句柄
    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,还有一些成员函数,消息处理函数等。 
    一个是句柄,用于标识,访问窗口对象
    一个是指针  指向一个窗口对象