none
基于MFC写的控件,OnCreate函数不会调用,导致程序崩溃 RRS feed

  • 问题

  • 写了一个单文档视图程序,并将其封装成activex控件。

    (1) 在CMyReaderCtrl的构造函数中加入文档视图类模板。

    // CMyReaderCtrl:: CMyReaderCtrl
    CMyReaderCtrl::  CMyReaderCtrl()
    {
        InitializeIIDs(&IID_DMyReader, &IID_DMyReaderEvents);

        SetInitialSize(0, 0);
        AddDocTemplate(new CActiveXDocTemplate(
            IDR_MAINFRAME,
            RUNTIME_CLASS(CMyReaderDoc),  
            RUNTIME_CLASS(CMainFrame),
            RUNTIME_CLASS(CMyReaderView)));

    }

    (2) 在CMyReaderCtrl::OnCreate()中获取控件的顶层父窗口句柄.

    int  CMyReaderCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CActiveXDocControl::OnCreate(lpCreateStruct) == -1)
        return -1;

        OnActivateInPlace(TRUE, NULL);
        App = ( CMyReaderApp *)AfxGetApp();
        App->m_hwnd  = GetTopParentWnd();   

        return 0;
    }

    (3) 在提供的接口函数Update()中去获取视图类的句柄,并调用视图类中的函数。

    LONG CMyReaderCtrl::Update(void)
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
       
        CFrameWnd *pFrame = (CFrameWnd *)App->GetMainWnd();                        (a)
        CMyReaderView *pView = (CMyReaderView *)pFrame->GetActiveView();      (b)
        pView->OnFileOpen();
        return 0;
    }

    写了一个简单的html页面在Debug模式下来调试控件,跟踪代码时发现程序有时候会在语句(a)或者(b)处崩溃。

          (a) 崩溃的原因是因为OnCreate()函数没有被调用,所以无法获得App的指针值。

          (b) 将语句 App = ( CMyReaderApp *)AfxGetApp() 加到Update()函数的第一行, 结果程序在GetActiveView()中崩溃,调用堆栈显示如下。

      CView* CFrameWnd::GetActiveView() const
    {
        ASSERT(m_pViewActive == NULL ||
            m_pViewActive->IsKindOf(RUNTIME_CLASS(CView)));
        return m_pViewActive;
    }

     

    BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
    {
        ENSURE(this != NULL);
        // it better be in valid memory, at least for CObject size
        ASSERT(AfxIsValidAddress(this, sizeof(CObject)));

        // simple SI case
        CRuntimeClass* pClassThis = GetRuntimeClass();                                          //此处为错误的指针值

        ENSURE(pClassThis);
        return pClassThis->IsDerivedFrom(pClass);
    }

    我想关键原因是OnCreate函数没有被调用,因为程序没有崩溃的时候都调用了OnCreate函数。不明白为什么有时候能进入该函数,而有时候却不行。

    网上有人说是不是没有指定控件的大小问题,但是我在html页面中的语句如下:

                 <OBJECT classid="clsid:22346751-AA21-4248-9FCD-F6CF92223265" id=Reader width=100% height=100%></object>

     

    2011年12月27日 8:59