我对句柄和指针之间如何进行转换不太了解,有谁能作一个详细介绍吗?

解决方案 »

  1.   

    hWnd = pWnd->GetSafeHwnd();
      

  2.   

    Windows SDK中介绍的都是从句柄转换成指针,但是反过来没有说,如果指针不是窗口的,比如说是一个位图的,该如何变成句柄?
      

  3.   

    指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直接操作时,可以使用GlobalLock锁住这段内存并获得指针来直接进行操作。
    句柄是指针的“指针”,使用句柄主要是为了利于windows在进程内存地址空间移动分配的内存块,以防止进程的内存空间被撕的四分五裂而存在过多的碎片
    句柄是一些表的索引也就是指向指针的指针。间接的引用对象,windows可以修改对象的"物理"地址和 描述器的值,但是句柄的值是不变的。
    句柄和指针都是地址,不同在于: 
        1,句柄所指的可以是一个很复杂的结构,并且很有可以是与系统有关的,比如说上面所说的线程的句柄,它指向的就是一个很类或者结构,他和系统有很密切的关系,当一个线程由于不可预料的原因,而终止时在系统就可以回它所占用的资料,如CPU,内存等等,反过来想可以知道,这个句柄中的某一些项,是与系统进行交互的。由于Windows系统,是一个多任务的系统,它随时都可能要分配内存,回收内存,重组内存。 
        2,指针它也可以指向一个复杂的结构,但是通常是用户定义的,所以的必需的工作都要用户完成,特别是在删除的时候。 
        但在VC++6.0中也有一些指针,它们都是处理一些小问题才用的,如最常见的字符的指针,它也是要用户处理的如果你动态分配了内存;但是Cstring就不要用户处理了,它其实是VC++中的一个类,所以的操作都由成员函数完成,产生(分配)由构造函数,删除(回收)由析构函数完成
      

  4.   

    CWnd* pWnd=FromeHandle(hMyHandle);
    pWnd->SetWindowText("This is just an example!");orCWnd* pWnd;
    pWnd->Attach(hMyHandle);
      

  5.   

    There are different types of handles in Win32 API, the three mains types are GDI handles, USEER handles and KERNEL handles.GDI handles are DDB handles, DIB section handles, region handles, font handles, brush handles, pen handles, ..USER handles are icon handles, cursor handles, windows handles, menu handles,KERNEL handles are file handles, device handels, thread handles, process handles, ...The basic information within a handle is normall an index into an hidden table kept by the system. For example, the lower 12 or 16-bit of a GDI handle is an index into GDI handle table kept by kernel mode Win32k.sys. On Win9X, GDI handle is just an index. On NT-based systesm, GDI handle has extra information.Handles are normally not pointers, although Win32 SDK header files define them as pointers.If you want to know everything you ever wanted to know about GDI handles, read the chapter 3 of my book.
      

  6.   

    句柄与指针的转换要根据具体情况来的,如果是MFC的类,一般提供了标准的方法:
    比如对于Window句柄:
    static CWnd* PASCAL FromHandle(
       HWND hWnd 
    );
    HWND GetSafeHwnd( ) const;对于位图:
    static CBitmap* PASCAL FromHandle(
       HBITMAP hBitmap 
    );
    static CGdiObject* PASCAL FromHandle(
       HGDIOBJ hObject 
    );
    HGDIOBJ GetSafeHandle( ) const;这些东西自己查一下MSDN就都有了。
      

  7.   

    特别感谢MuseIn(Air Supply) , Mackz(在相互) ,谢谢了!!!