前端时间不知道修改了什么,导致0xC0000005错误,最后通过断点发现,是在主窗口WM_SIZE调用“子窗口指针->GetClientRect(rect)抛出的错误,其中发现,此时的子窗口尚未创建,这大概是什么问题导致的?

解决方案 »

  1.   

    因为子窗口没建立之前,主窗口WM_SIZE消息就会产生,所以会出现窗口尚未创建的情况,一般情况下需要判断
    子窗口是否存在if ( 子窗口指针 != NULL && 子窗口指针->IsWindow() )
    {
     子窗口指针->GetClientRect(rect);
    }
      

  2.   

    在你GetClientRect之前先调用一下你的父类的函数,如:
    CScrollView::OnSize(nType, cx, cy);

    CView::OnSize(nType, cx, cy);这样就不会报错了
      

  3.   

    恩,可能我没说明白,我调用之前已经加入GetSafeHwnd()进行判断了,结果是,如果加了这句就自动退出,不加这句就会报错,可见是子窗口没法创建,那么,到底什么代码影响子窗口的创建呢?之前所说的都发生在子窗口的CChildFrame::PreCreateWindow(CREATESTRUCT& cs)触发之前
      

  4.   


    CChildFrame::PreCreateWindow之前,肯定没创建了。
    就在OnSize里判断,如果没创建,就不GetClientRect吧
      

  5.   

    我的意思是我判断过了,如果没用GetSafeHwnd()判断,就异常,判断了就避开了异常然后自动退出,所以根本原因是因为子窗口根本没办法创建,到底是什么原因所致的
      

  6.   

    你看一下消息调用流程就明白了 程序一上来先会进入WM_SIZE这个消息,然后才会创建你的子窗体