zoukankan      html  css  js  c++  java
  • [转载]从GetSafeHwnd()和GetSafeHandle()分析句柄和指针

    GetSafeHwnd()和GetSafeHandle()的主要区别:

    1.使用者不同:

    1)窗体使用:

    GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的对HWND指向的窗体进行所需的操作了;

    2)GDI对象使用:

    GetSafeHandle(),用于获取GDI对象的句柄。

     

    注意:在使用指针时强烈建议这么做:

    // pSomeWnd 为一个窗体的指针

    if ( NULL != pSomeWnd && NULL != pSomeWnd->GetSafeHwnd())

    {

      // do something.

       }

    //////////////////////////////////////////////////////////////////////

    补充知识:

    内存句柄与指针的区别:

    1).句柄其实就是指针,但是他和指针最大的不同是:给你一个指针,你可以通过这个指针做任何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用指针可能会导致程序崩溃。
    句柄就没有这个缺点,通过句柄,你只能干一些windows允许你干的事情(例如调用一些api函数等等),没有了指针的随意。

    2).句柄是一些表的索引也就是指向指针的指针。 句柄和指针都是地址,句柄是windows编程的一个关键性的概念,编写windows应用程序总是要和各种句柄打交道。
    所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷等。在win32里,句柄是指向一个“无类型对象”(void)的指针,也就是一个4字节长的数据。
    无论它的本质是什么,句柄并不是一个真正意义上的指针。
    从构造上看,句柄是一个指针,尽管它没有指向用于存储某个对象的内存位置。事实上,句柄指向一个包含了对该对象进行引用的位置。
    句柄的声明是这样的:
    typedef void handle

    由于windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,windows引入了实例句柄。windows为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。

     
    不同之处还在于:
    1、句柄所指的可以是一个很复杂的结构,并且很有可以是与系统有关的,比如说上面所说的线程的句柄,它指向的就是一个类或者结构,他和系统有很密切的关系,当一个线程由于不可预料的原因而终止时,系统就可以回收它所占用的资源,如cpu,内存等等。反过来想可以知道,这个句柄中的某一些项,是与系统进行交互的。由于windows系统是一个多任务的系统,它随时都可能要分配内存,回收内存,重组内存等。 
    2、指针它也可以指向一个复杂的结构,但是通常是用户定义的,所有的必需的工作都需用户完成,特别是在删除的时候。 但在vc++6.0中也有一些指针,它们都是在处理一些小问题才用的,如最常见的字符的指针 它也是需要用户处理的,譬如你动态分配了内存;但是cstring就不要用户处理了,它其实是vc++中的一个类,所有的操作都由成员函数完成,产生(分配)由构造函数,删除(回收)由析构函数完成。


    附注:获得窗口句柄三种方法

    1.HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName);

     

      HWND FindWindowEx( HWND hwndParent, HWND hwndChildAfter,                         LPCTSTR lpszClass, LPCTSTR lpszWindow );

    2.HWND WindowFromPoint( 
              POINT Point);//获得当前鼠标光标位置的窗口hwnd

    3.BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam);

     

    BOOL EnumChildWindows( HWND hWndParent,
                           WNDENUMPROC lpEnumFunc,
                           LPARAM lParam );
    BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ); 
    BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
    
    

    补充知识:指针和句柄之间的转换

    a.由指针获得句柄 
          CWND* pwnd ;
          HWND  hwnd ;
          hwnd = pwnd-> GetSafeHwnd();

    b.由句柄得到指针:
          CWND* pwnd = FromeHandle(hmyhandle);
          pwnd-> SetWindowText(" hello world!" ) ;

    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


    有人说句柄就是一个标示,一个id号,是错误的。一个id号可以包括多个资源,比如说单文档中的idr_mainframe,一般是指在硬盘上的资源。但是当把硬盘上的资源调入内存以后,将有一个句柄指向它,但是句柄只能指向一个资源。而且句柄知道所指的内存有多大。而指针指向地址,它不知道分配的内存有多大。
    但是如果你定义一个句柄,然后在vc里面右击鼠标,选择" go to definition of handle,你会发现它的本质就是一个指针,但是它的作用不同于指针。

    句柄是个指针,指向一块内存,但至于这块内存跟句柄所标识的对象是怎么联系起来的,调用者不需要清楚,调用者只需要知道,这个句柄联系着一个win32对象。
        句柄是物理地址,可以跨进程传递,例如,handle ha进程a的一个窗口,你可以在进程b中利用一个跟ha相等的值(相等就是说它们强制转成int32的值相等)初始化一个句柄。

     

    原文地址:http://blog.csdn.net/ghevinn/article/details/21445767

  • 相关阅读:
    Android OpenGL ES 2.0 (四) 灯光perfragment lighting
    Android OpenGL ES 2.0 (五) 添加材质
    冒泡排序函数
    javascript object 转换为 json格式 toJSONString
    Liunx CentOS 下载地址
    jquery 图片切换特效 鼠标点击左右按钮焦点图切换滚动
    javascript 解析csv 的function
    mysql Innodb Shutdown completed; log sequence number解决办法
    Centos 添加 yum
    javascript 键值转换
  • 原文地址:https://www.cnblogs.com/suanec/p/3892940.html
Copyright © 2011-2022 走看看