已有5人关注
客户端发送图片引发异常中断
发表在VC++图书答疑 2019-05-24 《Visual C++项目开发案例整合》第21章 企业QQ通信系统
是否精华
版块置顶:

老师,您好!

在Q友项目中,客户端发送图片时会引发异常中断,引发异常中断的代码已加粗!

这个问题要怎么解决呢?


// 选择图片 按钮事件

void CSendDlg::OnSendImg()

{

    CFileDialog flDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "图片文件|*.bmp;*.gif;*.jpg;*.jpeg;*.ico;||", this);

    if(flDlg.DoModal() == IDOK) {

        CString csFile = flDlg.GetPathName();  //获取图片文件名

        IRichEditOle *lpRichOle = m_SendEdit.GetIRichEditOle();

        if(lpRichOle != NULL) {

            InsertImage(lpRichOle, csFile);

            lpRichOle->Release();

            lpRichOle = NULL;

        }

    }

    // 防止发送窗口中的对象被选中

    m_ShowEdit.SetSel(-1, 0);

    m_ShowEdit.Invalidate();

}


// 向指定的消息框中插入图片

BOOL CSendDlg::InsertImage(IRichEditOle *lpRichEditOle, CString &csFileName)

{

    IStorage *lpStorage = NULL;        // 存储接口


    IOleObject *lpOleObject = NULL;    // OLE object


    LPLOCKBYTES lpLockBytes = NULL;

    IOleClientSite *lpOleClientSite = NULL;

    GIFLib::ICGifPtr lpAnimator;

    CLSID clsid;

    REOBJECT reobject;

    HRESULT hr;

    if(lpRichEditOle == NULL) {

        return FALSE;

    }


    hr = ::CoInitialize(NULL);  //初始化COM库

    if(FAILED(hr)) {

        _com_issue_error(hr);

    }

    hr = lpAnimator.CreateInstance(GIFLib::CLSID_CGif);


    //在此引发中断//////////////////////////////////////////////////////////////////////////////////////

    if(FAILED(hr)) {

        _com_issue_error(hr);

    }

    ////////////////////////////////////////////////////////////////////////////////////////////

    

    lpRichEditOle->GetClientSite(&lpOleClientSite);



    try {

        // 获取OLE对象接口


        hr = lpAnimator->QueryInterface(IID_IOleObject, (void **)&lpOleObject);

        if(FAILED(hr)) {

            AfxMessageBox("Error QueryInterface");

        }

        hr = lpOleObject->GetUserClassID(&clsid);

        if(FAILED(hr)) {

            AfxMessageBox("Error GetUserClassID");

        }

        // 防止出现错误提示


        lpOleObject->SetClientSite(NULL);

        lpOleObject->SetClientSite(lpOleClientSite);


        hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); // 创建LOCKBYTE对象


        if(FAILED(hr)) {

            AfxThrowOleException(hr);

        }

        ASSERT(lpLockBytes != NULL);

        hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,

                                            STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE,

                                            0, &lpStorage);

        if(FAILED(hr)) {

            VERIFY(lpLockBytes->Release() == 0);

            lpLockBytes = NULL;

            AfxThrowOleException(hr);

        }

        ZeroMemory(&reobject, sizeof(REOBJECT));   // 初始化一对象


        reobject.cbStruct = sizeof(REOBJECT);

        reobject.clsid = clsid;

        reobject.cp = REO_CP_SELECTION;

        reobject.dvaspect = DVASPECT_CONTENT;

        reobject.dwFlags = REO_BLANK;

        reobject.poleobj = lpOleObject;

        reobject.polesite = lpOleClientSite;

        reobject.pstg = lpStorage;

        hr = lpRichEditOle->InsertObject(&reobject);


        hr = lpAnimator->LoadFromFile(csFileName.AllocSysString());


        if(FAILED(hr)) {

            AfxThrowOleException(hr);

        }

        RedrawWindow();    // 刷新窗体


        lpOleClientSite->SaveObject();

        OleSetContainedObject(lpOleObject, TRUE);

    }

    catch(CException *e) {

        e->Delete();

    }

    lpAnimator->Release();

    lpStorage->Release();

    return TRUE;

}


分享到:
精彩评论 1
李木子
学分:2954 LV11
2019-05-27
沙发

你好:

  出现异常 可以抛出异常吧 你试试抛异常

首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照