static BOOL m_bOleInit;
CMyExcel::CMyExcel()
if(!m_bOleInit) m_bOleInit=AfxOleInit();

解决方案 »

  1.   


    按你的方法,可以重复调用了,但是在自定义线程里调用的时候还是会出错
    initole.cpp里面
    CWinThread* pThread; pThread = AfxGetThread();
    ASSERT(pThread);
    这里的断言出错
      

  2.   

    是的,奇怪的是哪怕我在线程里面发消息出来处理Excel的时候也一样的错误
    但是在线程开启的时候,我通过一个按钮手动触发Excel操作的时候就没问题
      

  3.   

    need code of “在自定义线程里调用”
      

  4.   


    DWORD WINAPI autoProc(LPVOID LPARAM)
    {
    ........
                         sInfo.Format(_T("%s%s%s"),_T("延时"),sStr[2],_T("秒"));
    engineer->DispToInfo(sInfo);                                          //显示并保存到Excel
    ...................
    }void CDlgEngineer::DispToInfo(CString str)
    {
    CString sInfo,sOld;
    sInfo.Format(_T("%s%s%s"),GetCurTime(),_T("     "),str);
    GetDlgItem(IDC_INFO)->GetWindowTextA(sOld);
    GetDlgItem(IDC_INFO)->SetWindowTextA(sOld+sInfo+"\r\n");               //显示到标签 CMyExcel m_excel;                                                                                           //Excel操作类 if (!m_excel.OpenExcelFile("D:\\444.xlsx"))
    {
    m_excel.CreateExcelFile();
    m_excel.SetSheetName(_T("sws"),1);
    CStringArray header;
    header.RemoveAll();
    header.Add(_T("aaa"));
    header.Add(_T("bbb"));
    header.Add(_T("ccc"));
    m_excel.SetHeader(header);
    }
    CStringArray stex; CString tim;
    tim.Format(_T("%s"),GetCurTime());
    stex.RemoveAll();
    stex.Add(tim);
    stex.Add(str);
    int r,c;
    m_excel.GetUsedRange(r,c);
    m_excel.AddRow(stex,r+1);
    m_excel.SetColor(r+1,2,EXCEL_RED);
    m_excel.SaveExcelFileAs("D:\\444.xlsx");
    m_excel.CloseExcelFile();
    }
    运行CWinThread* pThread; pThread = AfxGetThread();
    ASSERT(pThread);
    这里出错调用堆栈在那个Excel类里面
    if (!beOle)
    {
    if (!AfxOleInit())                               //这句的时候出错,但是不通过线程调用就没问题
    {
    DWORD aa=GetLastError();
    AfxMessageBox("初始化COM失败");
    }
    beOle=TRUE;
    }
      

  5.   


    重复初始化的已经跳过了
    AfxOleInit()        这里第一次初始化就报错了
      

  6.   

    beOle 必须是 static 的, 表示 类变量, 与 实例 个数 无关。
    CMyExcel m_excel;   一定要 放 堆栈 里? 
      

  7.   

    beOle 是static 的
    另外CMyExcel m_excel;定义为类成员同样会报错
    LPDISPATCH _Application::GetWorkbooks()
    {
    LPDISPATCH result;
    InvokeHelper(0x23c, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);//这句报错
    return result;
    }
    查看调用栈,
    m_excel.CreateExcelFile();具体是
    BOOL CMyExcel::CreateExcelFile()
    {
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
    books.AttachDispatch(app.GetWorkbooks()); //这里
                         book=books.Add(covOptional);
    sheets=book.GetWorksheets();
    sheet=sheets.GetItem(COleVariant((short)1));

    return TRUE;
    }
      

  8.   

    LPDISPATCH _Application::GetWorkbooks()
    {
    LPDISPATCH result;
    InvokeHelper(0x23c, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);//这句报错
    return result;
    }
    看看是什么错误。
      

  9.   


    Tech.exe 中的 0x7510812f 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0273f0d8 处的 COleException。
      

  10.   

    试试这个函数
    CoUninitialize
      

  11.   

    http://www.cnblogs.com/joeblackzqq/archive/2010/11/16/1878551.html
      

  12.   

    不能不知道啊,再帮我想想
    不知道是不是跟初始化与调用不在一个线程的关系如果把CMyExcel m_excel;放到函数里面一起接受线程调用就会变成另外一个错误,就是上面讲过的afxole()异常,
    如果CMyExcel m_excel;作为成员在线程启动前就实例化,然后线程调用时就会m_excel.CreateExcelFile();出现异常
      

  13.   

    但是如果不是通过线程去调用的话就一切正常,操作Excel读写的什么的都没有问题
      

  14.   

    initole.cpp里面
    CWinThread* pThread; pThread = AfxGetThread();
    ASSERT(pThread);
    这里的断言出错是不是 Excel 界面 不存在 ?
      

  15.   

    也没有什么界面啊,都是通过那个类去操作Excel的
    不知道这里的pThread到底是指什么
      

  16.   

    AfxOleInit()只支持单线程,所以采用成员变量调用Excel会出现问题。多线程访问excel请采用      HRESULT CoInitializeEx( void * pvReserved,  DWORD dwCoInit);具体参见msdn
     
      

  17.   

    确实是这样,用CoInitializeEx就可以了,无论是作为成员还是写在函数内部都可以
      

  18.   

    非常感谢各位大神帮我解决这个问题,特别是schlafenhamster , CodeMadman ,谢谢