初学VC,对句柄这个东西不明,它是什么东西,干什么用的?我看到有窗口句柄、位图句柄、文件句柄,请问这些句柄都是同一种结构吗?那这种结构是什么样的。如果不是同一种结构,请举一两个句柄结构的定义。谢谢!

解决方案 »

  1.   

    句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数。有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一(如线程句柄,全局的有另一个标识符)。
        详细的可分为许多种,都是以H开头的。常见的有窗口句柄(HWND),设备描述表句柄(HDC),内存句柄(HMEM),文件句柄,进程句柄,线程句柄,笔的类型句柄(HPEN),字体句柄(HFONT),区域句柄(HRGN)等等。
        在Windows系统中,句柄分为三大类:Kernel Handle、User Handle和应用程序自定义的Handle。
        Kernel Handle实际上是进程内Kernel对象的指针表索引,Kernel对象包括进程、文件、信号等。但是MS为了掩盖着一事实,在系统启动时生成了一个所谓Obsfucator的值(其实应该是Obfuscator,Microsoft Bugs(R) :),生成Handle后将Handle与这个值异或后返回给应用程序,所以看到的Handle都是一些很大而且毫无意义的数字。这些Handle和索引的对象是由KRNL32.DLL和VMM32.VXD共同管理的,所以称之为Kernel Handle。
        User Handle是用来标示窗口、DC等对象的,他们是真实的指针,但指向的并不是对象的开头,有一个偏移量。同样,这些对象是由USER32.DLL管理的。
        第三种Handle不过是应用程序自定义的一些索引之类的东东,具体的意义和应用程序相关。
      

  2.   

    那我如何使用它?HWND.?HWND->?还是其他方法?
      

  3.   

    BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)
    {
        HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, _T("start.bmp"), IMAGE_BITMAP,
                0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
        if( hBitmap == NULL)
                return false;
        m_bitmap.Attach(hBitmap);     // 获取位图指针
    }
    请注意:HBITMAP就是一个位图句柄
      

  4.   

    实际上是 Windows 内部对应数据结构的索引值,一个32位的数值。
      

  5.   

    其实,句柄和vc没有什么关系,只是windows操作系统的一个东西,你可以通过对句柄的操作来完成对与句柄对应的系统资源的操作,比如你有一个窗口句柄,你就可以对这个窗口进行操作,例如你想移动窗口,你可以这样做:
    MoveWindow(hwnd,0,0,100,100,true);
    其中第一个参数就是你想移动的窗口的句柄,这个值代表了一个窗口,当然你如果在VC环境下编写程序,就可以用窗口类的一个函数实现这个功能:
    CWnd.MoveWindow(.....);
    在这个方法中,你用不到句柄,因为窗口类已经将句柄值包含在窗口实例中了。不知道你明白了没有:)
      

  6.   

    就是void类型的指针了,指向一个内存空间。然而这个内存空间具体是什么东西,恰恰就是使用句柄这个东西的人想要隐藏的一些细节。也就是说他们不希望使用这个函数的人知道句柄的内容是什么。比如你在你的程序中定义了一个结构,然而你不想要其他人知道这个结构的具体内容,但是你的另外一个函数里面需要用到这个结构,你就可以让其他的函数返回一个空指针,指向这个结构的收地址,然后在其他函数里面类型转换一下,就可以使用这个结构了。
      

  7.   

    你可以看看这个贴子
    http://www.csdn.net/expert/topic/791/791714.xml?temp=.8232996