我是在MFC中创建excel,在执行下面一句
objRange = objSheet.get_Range(COleVariant(s),COleVariant(str));时就会出现 COledispatchException异常。不知道怎么回事,因为刚研究在MFC中运用excel,所以不是很明白,菜鸟级别,希望各位高手不吝赐教。多谢!!

解决方案 »

  1.   

    查查异常体的COleDispatchException::m_strDescription
      

  2.   


    不好意思,怎么查?调试到
    CATCH_ALL(e)
    {
    lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
    TRACE(traceAppMsg, 0, "Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
    DELETE_EXCEPTION(e);
    }
    END_CATCH_ALL pThreadState->m_lastSentMsg = oldState;
    return lResult;
    发现lResult=1;然后不知道从什么地方得到m_strDescription
      

  3.   

    CATCH_ALL(COleDispatchException e)
    {
       MessageBox(e.m_strDescription)
    }类似这样,没测试过啊
      

  4.   


    我想把异常捕捉到
    try{
    objRange = objSheet.get_Range(COleVariant(s),COleVariant(str));
    }catch(COleDispatchException e)
    {
     MessageBox(e.m_strDescription); }
    但是运行到objRange = objSheet.get_Range(COleVariant(s),COleVariant(str));就进入CATCH ALL(e)了,没法进入我的catch(COleDispatchException e)怎么办?新手,希望不要见笑
      

  5.   

    那throw出的可能不是COleDispatchException
    试试插入
    CATCH( CException, pEx )
       {
          // Simply show an error message to the user.
          pEx->ReportError();
       }
      

  6.   


    显示error:不允许抽象类型“CException”作为catch类型
      

  7.   

    用指针或者引用,MS的CATCH宏可能有问题,直接用c语言的货:try{
    objRange = objSheet.get_Range(COleVariant(s),COleVariant(str));
    }catch(CException& e)
    {
    e.ReportError();
    }
      

  8.   

    这样就进不去catch了,不知道为什么
      

  9.   


    try{
    objRange = objSheet.get_Range(COleVariant(s),COleVariant(str));
    }catch(CException* e)
    {
    e->ReportError();
    }
      

  10.   

    多谢 mcmcmc 的帮助,问题找到了,是str 的问题,str是从string类型转换成CString的,当我吧str 换成具体的字符串“E1”时,没有异常了。
      

  11.   


    不知道为什么,现在如果str是动态变化的,还是没有找到为什么会这样,str也是CString,“E1”也是一个字符串,为什么用str就不对呢
      

  12.   


    这次可以进入catch,执行后,出现的提示窗口,是空的,就是说输出的错误信息是空的,这是什么错误?
      

  13.   

    const COleVariant& COleVariant::operator=(const LPCTSTR lpszSrc)
    {
    // Free up previous VARIANT
    Clear(); vt = VT_BSTR;
    if (lpszSrc == NULL)
    bstrVal = NULL;
    else
    {
    bstrVal = CTempStringW(lpszSrc).AllocSysString();
    }
    return *this;
    }const COleVariant& COleVariant::operator=(const CString& strSrc)
    {
    // Free up previous VARIANT
    Clear(); vt = VT_BSTR;
    bstrVal = strSrc.AllocSysString(); return *this;
    }好像差不多
    改成不知如何
    objRange = objSheet.get_Range(COleVariant((LPCTSTR)s),COleVariant((LPCTSTR)str));
      

  14.   

    objRange = objSheet.get_Range(COleVariant((LPCTSTR)s),COleVariant((LPCTSTR)str));
    还是不行,会出现异常
      

  15.   

    难道是BSTR多次释放引起COleVariant var1(s);
    COleVariant var2(str);
    objRange = objSheet.get_Range(var1.Detach(),str.Detach());
      

  16.   


    很奇怪,因为程序中多次用到这个语句,第一个语句是:
    objRange = objSheet.get_Range(COleVariant(str), varOptional);在这里没错。从第二个语句objRange = objSheet.get_Range(COleVariant(s),COleVariant(str));开始出异常的,
    我按你上面的方法修改之后,第二个语句不出异常了,所以我就把后面的都改成这个格式了,结果发现后面的还是出现异常
      

  17.   

    我以前一个项目和你一样是COleVariant(str)格式的,没什么问题,估计还是其他地方有问题
    试试下面:
    COleVariant var1,var2;
    var1=s;
    var2=str;
    objRange = objSheet.get_Range(var1.Detach(),var2.Detach());
    var1=s;
    var2=str;
    objRange = objSheet.get_Range(var1.Detach(),var2.Detach());
    或者用CComVariant试试,和你原始做法一样
    #include <atlcomcli.h>
      

  18.   

    多谢cmcmcm的帮助,问题解决了,是因为字符串CString与string转化的问题,改变一下方法,避开CString与string的转化,就不出现异常了,太感谢您了!!