如果这个函数的内部实现是这样:HWND CWnd::GetSafeHwnd(){
    if(m_hWnd==NULL)
        return NULL;
    else return m_hWnd;    
}
那么和直接return m_hWnd有什么区别吗? 反正m_hWnd为NULL的时候返回的也是m_hWnd的值。到底为什么要搞出GetSafeHwnd(),GetSafeHmenu()这样的一些函数来呢? 为了解决什么样的问题?谢谢!

解决方案 »

  1.   

    HWND CWnd::GetSafeHwnd() const
    { return this == NULL ? NULL : m_hWnd; }
    它的实现是这样的吧
    Returns the window handle for a window. Returns NULL if the CWnd is not attached to a window or if it is used with a NULL CWnd pointer. 
      

  2.   

    GetSafeHwnd() 非空句柄。
    GetHwnd() 可能为空句柄。一般句柄的作用:转指针,确定发送消息目标。
    空句柄转不了指针,当然发送目标也会失败啊。
      

  3.   

    GetHwnd() 可能为空句柄。这个东西不存在啊,我就是和上面对比
      

  4.   

    是为了CWnd指针为空的时候访问这个函数不会崩溃……不是很好的设计,鼓励使用空指针
      

  5.   

    CWnd* pWnd = NULL;
    pWnd->GetSafeHwnd(); 
      

  6.   

    还是不明白是为了CWnd指针为空的时候访问这个函数不会崩溃……1不是很好的设计,2鼓励使用空指针1和2的区别何在
      

  7.   

    虽然它的实现是这个,但是我曾经遇到一个问题时,发现这个GetSafeHwnd()是很有必要的,当这个窗口对象指针为0xCDCDCDCDCD..时,即“CWnd is not attached to a window”,这时候这个指针既不为Null但是同样也不能够使用,如果直接使用GetHwnd()或者m_hWnd,则会跑出异常。但是,使用GetSafeHwnd()会将该未与窗口关联的句柄赋值为NULL,也就是这种情况下GetSafeHwnd()返回值为NULL,是不是很安全了。。
    我的理解是,在“CWnd is not attached to a window”时,这个对象指针即this是为NULL的,但是m_hWnd可能是不为NULL的。使用GetSafeHwnd()首先会判断对象是否可用,才会返回句柄m_hWnd.
    微软并不是多此一举的行为
      

  8.   

    pDlg是非模态的,create了、但没有show
    需要在其他线程判断窗口是否可用
    if(!::IsWindow(pDlg->GetSafeHwnd()))
    {
    //一些窗口方法不可用
    }
      

  9.   

     反正m_hWnd为NULL的时候返回的也是m_hWnd的值。
    -----------
    错值跟NULL是不一样的,因为别处认为NULL是错的。