在工作者线程中操作Excel要初始化OLE

来源:互联网 发布:如何在淘宝上买烟 编辑:程序博客网 时间:2024/06/05 06:34

线程中通过Ole调用Excel出现错误
不用线程的情况下正常工作,由于操作比较大的excel要比较长时间,所以放在线程中工作,没想到运行时出现错误,
跳出 dbgheap.c 第268行
pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);

请问这是什么情况?

------解决方案--------------------
我也弄这个 期待答案 愁死我了 
------解决方案--------------------
在线程中重新ole初始化试试 
------解决方案--------------------
楼主你应该贴前面几个堆栈的代码,好分析点。
你先试下把所有与excel相关的代码都放在这个线程里,并保证只开了一个线程。 
------解决方案--------------------
要在线程中做初始化






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

[求助] 请教高手:VC 在多线程中调用Exce问题 [复制链接]

UINT CDlgYield::StartThread (LPVOID pParam )
{
        CDlgYield* pDlg = (CDlgYield*) pParam;

        CReadExcel        m_cReadExcel;
        m_cReadExcel.SetOperator(pDlg->m_pXlOper);  // m_pXlOper内含有Excel对象

        // 读取文件
        m_cReadExcel.Processing (pDlg->m_cOper);

//        pDlg->m_cOper.Close();        // 关闭数据库

        //
        CWnd* pWnd_OK                = pDlg->GetDlgItem(IDOK);
        CWnd* pWnd_CANCEL        = pDlg->GetDlgItem(IDCANCEL);

        pWnd_OK->EnableWindow (TRUE);
        pWnd_CANCEL->EnableWindow (TRUE);

        return 0;
}
void CDlgYield::OnBnClickedOk()
{
        // 方法1:多线程方式
        //
#ifdef USE_MULTHREAD
        pThread = AfxBeginThread((AFX_THREADPROC)CDlgYield::StartThread, this);
#else
        // 方法2:直接在函数中处理
        m_cReadExcel.SetOperator(m_pXlOper);

        // 读取文件
        m_cReadExcel.Processing (m_cOper);

//        m_cOper.Close();        // 关闭数据库 关闭数据库 ---- 不能使用,否则不支持连续操作


        //
        pWnd_OK->EnableWindow (TRUE);
        pWnd_CANCEL->EnableWindow (TRUE);
#endif


问题:
方法1、通过多线程调用 ---- Excel出现异常,读写Excel出现问题
方法2、不通过多线程调用 ---- Excel正常,读写都没有问题

测试的现象:5台计算机有3台在多线程方式下不能用。

请问,在多线程机制下,怎么调用Excel对象?在线程中        ::CoInitialize(NULL);也不行

1) 每个线程必须先::CoInitialize(NULL);,退出时必须::UnCoInitialize(NULL);,
2) pDlg->m_pXlOper,即线程使用m_pXl内Excel对象,必须遵守COM/COM+规范,简单说,对象接口指针必须遵守一个规范:计数增一,退出时计数减一
3)多线程共享接口指针,还有很多要注意的地方,比如套间等,不能象C/C++程序自己设计的对象指针那么简单对待
后来在别的网站上查询到:
在线程里采用多线程方式初始化COM,就OK了。

        HRESULT hr = ::CoInitializeEx( NULL, COINIT_MULTITHREADED );
0 0