none
通过位图句柄往 RichEditView 插入图片,debug 版在程序退出时出错,而 release 版则无任何错误提示,why ? RRS feed

  • 问题

  • 如题,非常奇怪的问题。

    在我的继承 RichEditView 的单文档程序中,我用如下代码给 view 插入一个位图
    debug 版在程序“退出”时出错(不退出之前一切操作正常),提示:
    Debug Assertion Failed!
    Program:D:\....
    File:cmdtarg.cpp
    Line::52
    ........

    而 release 版则无任何错误提示,这是为什么呢?


    第一步: 在doc.cpp中的代码
    void C×××Doc::InsertBitmap(HBITMAP hBitmap) //插入图片句柄 { CRichEditView *pView = GetView(); CRichEditCtrl &edit = pView->GetRichEditCtrl(); STGMEDIUM stgm; //给COleDataSource.CacheData() 用 stgm.tymed = TYMED_GDI; // Storage medium = HBITMAP handle stgm.hBitmap = hBitmap; //位图句柄 stgm.pUnkForRelease = NULL; // Use ReleaseStgMedium FORMATETC fm; fm.cfFormat = CF_BITMAP; // Clipboard format = CF_BITMAP fm.ptd = NULL; // Target Device = Screen fm.dwAspect = DVASPECT_CONTENT; // Level of detail = Full content fm.lindex = -1; // Index = Not applicaple fm.tymed = TYMED_GDI; //创建输入数据源 IStorage *pStorage; //分配内存 LPLOCKBYTES lpLockBytes = NULL; SCODE 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); COleDataSource *pDataSource = new COleDataSource; pDataSource->CacheData(CF_BITMAP, &stgm); LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject); ///获取RichEdit的OLEClientSite LPOLECLIENTSITE lpClientSite; pView->GetRichEditCtrl().GetIRichEditOle()->GetClientSite(&lpClientSite); ///创建OLE对象 IOleObject *pOleObject; sc = OleCreateStaticFromData(lpDataObject,IID_IOleObject,OLERENDER_FORMAT, &fm,lpClientSite,pStorage,(void **)&pOleObject); if(sc!=S_OK) AfxThrowOleException(sc); ///插入OLE对象 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.poleobj = pOleObject; //创建好的ole对象 reobject.polesite = lpClientSite; reobject.pstg = pStorage; //IStorage的输入数据源 HRESULT hr = pView->GetRichEditCtrl().GetIRichEditOle()->InsertObject(&reobject);
    // if (pDataSource!=NULL) {delete pDataSource;pDataSource=NULL;} // if (pOleObject!=NULL) {pOleObject=NULL;} //用了这2个也同样出错 }
    第二步:在mainfrm.cpp的一个函数中这样调用上面的函数:
     HBITMAP hbmp = NULL;
     hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),_T("d:\\0.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
     pCurrentDoc->InsertBitmap(hbmp);



    谢谢指教 ^_^
    2009年8月30日 6:04

答案

  • 这是断言错误,是由程序BUG引起的.

    ASSERT这个宏当其在为0的时候只有在Debug下提示错误.在Release模式下被忽略.它主要用于防止空指针的出现.
    0xBAADF00D
    • 已标记为答案 Tim Li 2009年9月11日 3:07
    2009年8月30日 7:44
    版主

全部回复

  • 这是断言错误,是由程序BUG引起的.

    ASSERT这个宏当其在为0的时候只有在Debug下提示错误.在Release模式下被忽略.它主要用于防止空指针的出现.
    0xBAADF00D
    • 已标记为答案 Tim Li 2009年9月11日 3:07
    2009年8月30日 7:44
    版主
  • 有什么解决办法吗

    1 出现这个提示,多少证明程序存在着我仍未知的隐患,这让我不安心 & 不踏实,so,可否指点一二可能存在错误的地方 & 怎么改呢

    2 老是跳出这个错误,也很影响调试的,如果实在无法该好这个错误,我又该怎样忽略这个错误,让它不要老是跳出来呢

    谢谢指教
    2009年8月30日 12:08
  • 还得看调用堆栈,以及对象当时的数据

    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年8月30日 12:56
    版主
  • oh,my god,我还真不知道该怎么去看这两样东西,呵呵,我调试程序只会用 MessageBox() ,shame.....
    2009年8月30日 13:04