viewrich.cpp中的调试断言错误 我在VS2010中创建了一个简单的MFC文本编辑器,以便学习C++,我碰到了一个绊脚石……

viewrich.cpp中的调试断言错误 我在VS2010中创建了一个简单的MFC文本编辑器,以便学习C++,我碰到了一个绊脚石……,c++,visual-studio-2010,mfc,C++,Visual Studio 2010,Mfc,也就是说,尽管一切都是经过编译的。在调试模式下运行程序时,viewrich.cpp的第151、156和1875行出现“调试断言失败”错误,这是VS2010 MFC的一部分 第151行和第156行属于以下代码: int CRichEditView::OnCreate(LPCREATESTRUCT lpcs) { if (CCtrlView::OnCreate(lpcs) != 0) return -1; GetRichEditCtrl().LimitText(lMa

也就是说,尽管一切都是经过编译的。在调试模式下运行程序时,viewrich.cpp的第151、156和1875行出现“调试断言失败”错误,这是VS2010 MFC的一部分

第151行和第156行属于以下代码:

int CRichEditView::OnCreate(LPCREATESTRUCT lpcs)
{
    if (CCtrlView::OnCreate(lpcs) != 0)
        return -1;
    GetRichEditCtrl().LimitText(lMaxSize);
    GetRichEditCtrl().SetEventMask(ENM_SELCHANGE | ENM_CHANGE | ENM_SCROLL);
    VERIFY(GetRichEditCtrl().SetOLECallback(&m_xRichEditOleCallback)); //LINE 151
    m_lpRichEditOle = GetRichEditCtrl().GetIRichEditOle();
    DragAcceptFiles();
    GetRichEditCtrl().SetOptions(ECOOP_OR, ECO_AUTOWORDSELECTION);
    WrapChanged();
    ASSERT(m_lpRichEditOle != NULL); //LINE 156
    return 0;
}
void CRichEditDoc::SetTitle(LPCTSTR lpszTitle)
{
    COleServerDoc::SetTitle(lpszTitle);
    CRichEditView *pView = GetView();
    ASSERT(pView != NULL);
    ASSERT(pView->m_lpRichEditOle != NULL); // LINE 1875
    CStringA strAppName(AfxGetAppName()), strTitle(lpszTitle);
    pView->m_lpRichEditOle->SetHostNames(strAppName.GetString(), 
        strTitle.GetString());
}
第1875行是以下代码之一:

int CRichEditView::OnCreate(LPCREATESTRUCT lpcs)
{
    if (CCtrlView::OnCreate(lpcs) != 0)
        return -1;
    GetRichEditCtrl().LimitText(lMaxSize);
    GetRichEditCtrl().SetEventMask(ENM_SELCHANGE | ENM_CHANGE | ENM_SCROLL);
    VERIFY(GetRichEditCtrl().SetOLECallback(&m_xRichEditOleCallback)); //LINE 151
    m_lpRichEditOle = GetRichEditCtrl().GetIRichEditOle();
    DragAcceptFiles();
    GetRichEditCtrl().SetOptions(ECOOP_OR, ECO_AUTOWORDSELECTION);
    WrapChanged();
    ASSERT(m_lpRichEditOle != NULL); //LINE 156
    return 0;
}
void CRichEditDoc::SetTitle(LPCTSTR lpszTitle)
{
    COleServerDoc::SetTitle(lpszTitle);
    CRichEditView *pView = GetView();
    ASSERT(pView != NULL);
    ASSERT(pView->m_lpRichEditOle != NULL); // LINE 1875
    CStringA strAppName(AfxGetAppName()), strTitle(lpszTitle);
    pView->m_lpRichEditOle->SetHostNames(strAppName.GetString(), 
        strTitle.GetString());
}
以下是相关文件:

cntritem.h:

#include "afxrich.h"
// #include "Resource.h"
class CEmergenceDoc;
class CEmergenceView;

class CEmergenceCntrItem : public CRichEditCntrItem
{
    DECLARE_SERIAL(CEmergenceCntrItem)

// Constructors
public:
    CEmergenceCntrItem(REOBJECT* preo = NULL, CEmergenceDoc* pContainer = NULL);
        // Note: pContainer is allowed to be NULL to enable      
                IMPLEMENT_SERIALIZE.
        //  IMPLEMENT_SERIALIZE requires the class have a constructor with
        //  zero arguments.  Normally, OLE items are constructed with a
        //  non-NULL document pointer.

// Attributes
public:
    CEmergenceDoc* GetDocument()
        { return (CEmergenceDoc*)COleClientItem::GetDocument(); }
    CEmergenceView* GetActiveView()
        { return (CEmergenceView*)COleClientItem::GetActiveView(); }

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CWordPadCntrItem)
    public:
    protected:
    //}}AFX_VIRTUAL

// Implementation
public:
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif
};
EmergenceView.cpp

#include "stdafx.h"
// SHARED_HANDLERS can be defined in an ATL project implementing preview, thumbnail
// and search filter handlers and allows sharing of document code with that project.
#ifndef SHARED_HANDLERS
#include "Emergence.h"
#endif
#include "EmergenceDoc.h"
#include "EmergenceView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CEmergenceView

IMPLEMENT_DYNCREATE(CEmergenceView, CRichEditView)

BEGIN_MESSAGE_MAP(CEmergenceView, CRichEditView)
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, &CRichEditView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, &CRichEditView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CEmergenceView::OnFilePrintPreview)
    ON_WM_CONTEXTMENU()
    ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

// CEmergenceView construction/destruction

CEmergenceView::CEmergenceView()
{
    // TODO: add construction code here

}

CEmergenceView::~CEmergenceView()
{
}

BOOL CEmergenceView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    return CView::PreCreateWindow(cs);
}

// CEmergenceView drawing

void CEmergenceView::OnDraw(CDC* /*pDC*/)
{
    CEmergenceDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: add draw code for native data here
}


// CEmergenceView printing


void CEmergenceView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
    AFXPrintPreview(this);
#endif
}

BOOL CEmergenceView::OnPreparePrinting(CPrintInfo* pInfo)
{
    // default preparation
    return DoPreparePrinting(pInfo);
}

void CEmergenceView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: add extra initialization before printing
}

void CEmergenceView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: add cleanup after printing
}

void CEmergenceView::OnRButtonUp(UINT /* nFlags */, CPoint point)
{
    ClientToScreen(&point);
    OnContextMenu(this, point);
}

void CEmergenceView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
    theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y,     

this, TRUE);
#endif
}

// CEmergenceView diagnostics

#ifdef _DEBUG
void CEmergenceView::AssertValid() const
{
    CView::AssertValid();
}

void CEmergenceView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}

CEmergenceDoc* CEmergenceView::GetDocument() const // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEmergenceDoc)));
    return (CEmergenceDoc*)m_pDocument;
}
#endif //_DEBUG


// CEmergenceView message handlers
EmergenceDoc.cpp

#include "stdafx.h"
#include "Emergence.h"

#include "EmergenceDoc.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

extern BOOL AFXAPI AfxFullPath(LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
extern UINT AFXAPI AfxGetFileTitle(LPCTSTR lpszPathName, LPTSTR lpszTitle, UINT nMax);

#ifndef OFN_EXPLORER
#define OFN_EXPLORER 0x00080000L
#endif

#include "cntritem.h"

IMPLEMENT_DYNCREATE(CEmergenceDoc, CRichEditDoc)

BEGIN_MESSAGE_MAP(CEmergenceDoc, CRichEditDoc)
    ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, 
        CRichEditDoc::OnUpdateEditLinksMenu)
    ON_COMMAND(ID_OLE_EDIT_LINKS, CRichEditDoc::OnEditLinks)
    ON_UPDATE_COMMAND_UI_RANGE(ID_OLE_VERB_FIRST, 
        ID_OLE_VERB_LAST, CRichEditDoc::OnUpdateObjectVerbMenu)
END_MESSAGE_MAP()

CEmergenceDoc::CEmergenceDoc()
{
}

CEmergenceDoc::~CEmergenceDoc()
{
}

BOOL CEmergenceDoc::OnNewDocument()
{
    if (!CRichEditDoc::OnNewDocument())
        return FALSE;
    return TRUE;
}

CRichEditCntrItem* CEmergenceDoc::CreateClientItem(REOBJECT* preo) const
{
    return new CEmergenceCntrItem(preo, (CEmergenceDoc*) this);
}

void CEmergenceDoc::Serialize(CArchive& ar)
{
    CRichEditDoc::Serialize(ar);
}

#ifdef _DEBUG
void CEmergenceDoc::AssertValid() const
{
    CRichEditDoc::AssertValid();
}

void CEmergenceDoc::Dump(CDumpContext& dc) const
{
    CRichEditDoc::Dump(dc);
}
#endif //_DEBUG
cntritem.cpp

#include "stdafx.h"
#include "Emergence.h"

#include "EmergenceDoc.h"
#include "EmergenceView.h"
#include "cntritem.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_SERIAL(CEmergenceCntrItem, CRichEditCntrItem, 0)

CEmergenceCntrItem::CEmergenceCntrItem(REOBJECT *preo, CEmergenceDoc* pContainer)
    : CRichEditCntrItem(preo, pContainer)
{
}

#ifdef _DEBUG
void CEmergenceCntrItem::AssertValid() const
{
    CRichEditCntrItem::AssertValid();
}

void CEmergenceCntrItem::Dump(CDumpContext& dc) const
{
    CRichEditCntrItem::Dump(dc);
}
#endif

任何帮助都将不胜感激。

可能是您的InitInstance中缺少对AfxOleInit的呼叫


这就是OLE工具失败的原因。

嘿,xMRi,谢谢你的回复。我检查过了,我的InitInstance中的AfxOleInit就在那里。从viewrich.cpp的第151、156和1875行给我一个“Debug Assertion Failed”错误的事实来看,我猜这个错误与富编辑ole有关。但我是一个初学者,想要弄清楚我遗漏了什么,以及它们是如何结合在一起的,这有点让人不知所措(你解决了吗?如果是,你还记得怎么解决的吗?我也面临着同样的问题…在CRichEditView*pView=GetView();ASSERT(pView!=NULL)获取调试断言;有什么建议吗?)??