在工作者线程中操作Excel要初始化OLE
Microsoft技术社区联盟成员,全球领先的Excel门户,Office培训学习的最佳社区 加关注繁體中文切换到窄版123456帐号:记住帐号 找回密码密码: 免费注册
·
线程中通过Ole调用Excel出现错误
不用线程的情况下正常工作,由于操作比较大的excel要比较长时间,所以放在线程中工作,没想到运行时出现错误,
跳出 dbgheap.c 第268行
pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);
请问这是什么情况?
------解决方案--------------------
我也弄这个 期待答案 愁死我了
------解决方案--------------------
在线程中重新ole初始化试试
------解决方案--------------------
楼主你应该贴前面几个堆栈的代码,好分析点。
你先试下把所有与excel相关的代码都放在这个线程里,并保证只开了一个线程。
------解决方案--------------------
要在线程中做初始化
//
[求助] 请教高手:VC 在多线程中调用Exce问题
{ 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);也不行 | UINT CDlgYield::StartThread (LPVOID pParam )
2) pDlg->m_pXlOper,即线程使用m_pXl内Excel对象,必须遵守COM/COM+规范,简单说,对象接口指针必须遵守一个规范:计数增一,退出时计数减一 3)多线程共享接口指针,还有很多要注意的地方,比如套间等,不能象C/C++程序自己设计的对象指针那么简单对待 | 1) 每个线程必须先::CoInitialize(NULL);,退出时必须::UnCoInitialize(NULL);,
后来在别的网站上查询到:
在线程里采用多线程方式初始化COM,就OK了。
HRESULT hr = ::CoInitializeEx( NULL, COINIT_MULTITHREADED );
在线程里采用多线程方式初始化COM,就OK了。
HRESULT hr = ::CoInitializeEx( NULL, COINIT_MULTITHREADED );
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)