点击“重试”调制断点处,图纸红色出断言失败 m_dwRef的值为2;另外我发现的release模式下没有问题

解决方案 »

  1.   

    贴上其中的关键代码 请大家帮忙看看吧 谢了
    void CTapEditorView::OnInsertImage() 
    {
    // TODO: Add your command handler code here
    CString sFilter = "All image file|*.bmp;*.jpg;*.gif|Bitmap Files (*.bmp)|*.bmp|JPEG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif|";
    CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST|OFN_READONLY, sFilter);
    if(dlg.DoModal() == IDOK)
    {
    CTapBitmap bmp;
    if(bmp.Load(dlg.GetPathName())==FALSE)
    {
    AfxMessageBox(_T("Could not load image."));
    return;
    }
    CEnBitmap enBitmap;
    CBitmap Bitmap;
    if (enBitmap.Attach(bmp.GetBMP(), 0))
    {
    Bitmap.DeleteObject();
    Bitmap.Attach(enBitmap.Detach());

    IRichEditOle *pRichEditOle;
    pRichEditOle = GetRichEditCtrl().GetIRichEditOle();
    HBITMAP hBitmap = (HBITMAP)Bitmap;
    if(hBitmap)
    {
    CImageDataObject::InsertBitmap(pRichEditOle, hBitmap);
    }
    }
    }
    }其中CImageDataObject是继承自IDataObject
    void CImageDataObject::InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap)
    {
    SCODE sc; // Get the image data object
    //
    CImageDataObject *pods = new CImageDataObject;
    LPDATAOBJECT lpDataObject;
    pods->QueryInterface(IID_IDataObject, (void **)&lpDataObject); pods->SetBitmap(hBitmap); // Get the RichEdit container site
    //
    IOleClientSite *pOleClientSite;
    pRichEditOle->GetClientSite(&pOleClientSite); // Initialize a Storage Object
    //
    IStorage *pStorage; LPLOCKBYTES lpLockBytes = NULL;
    sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    if (sc != S_OK)
    AfxThrowOleException(sc);
    ASSERT(lpLockBytes != NULL);

    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
    STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
    if (sc != S_OK)
    {
    VERIFY(lpLockBytes->Release() == 0);
    lpLockBytes = NULL;
    AfxThrowOleException(sc);
    }
    ASSERT(pStorage != NULL); // The final ole object which will be inserted in the richedit control
    //
    IOleObject *pOleObject; 
    pOleObject = pods->GetOleObject(pOleClientSite, pStorage); // all items are "contained" -- this makes our reference to this object
    //  weak -- which is needed for links to embedding silent update.
    OleSetContainedObject(pOleObject, TRUE); // Now Add the object to the RichEdit 
    //
    REOBJECT reobject;
    ZeroMemory(&reobject, sizeof(REOBJECT));
    reobject.cbStruct = sizeof(REOBJECT);

    CLSID clsid;
    sc = pOleObject->GetUserClassID(&clsid);
    if (sc != S_OK)
    AfxThrowOleException(sc); reobject.clsid = clsid;
    reobject.cp = REO_CP_SELECTION;
    //reobject.dvaspect = DVASPECT_CONTENT;
    reobject.dvaspect = DVASPECT_CONTENT;
    reobject.dwFlags = REO_RESIZABLE ; reobject.poleobj = pOleObject;
    reobject.polesite = pOleClientSite;
    reobject.pstg = pStorage; // Insert the bitmap at the current location in the richedit control
    //
    pRichEditOle->InsertObject(&reobject); // Release all unnecessary interfaces
    //
    pOleObject->Release();
    pOleClientSite->Release();
    pStorage->Release();
    lpDataObject->Release();
    }
      

  2.   

    我自己解决了 就是把 IRichEditOle *pRichEditOle;这个指针给释放了就好了
    pRichEditOle->Release();
    之前我二的用的是delete!呵呵!