static BOOL m_bOleInit;
CMyExcel::CMyExcel()
if(!m_bOleInit) m_bOleInit=AfxOleInit();
CMyExcel::CMyExcel()
if(!m_bOleInit) m_bOleInit=AfxOleInit();
解决方案 »
- SEH也无法捕获到的异常,有朋友能解释下吗? 3q
- 有谁有cximage啊,在哪里可以下载到!
- 请问用SetItem给一个TabCtrl控件赋值然后为何用GetItem得不到?
- 如何建立控件对象和数组的关联
- mfc怎样通过ado把内存的不同字段写如SQL
- 通过ADO如何判断一个栏位是否为 自动增长 ?
- 200分求acdsee的auto levels实现原理,先开100分。
- 紧急求救:DEBUG版本中没有问题,RELEASE版本中有内存问题。请各位帮忙!!!!
- 对防火墙技术感兴趣的请看!
- 用CSocket接收2k的UDP包时出错,请问如何改正?
- GDI+里,有没有跟GDI函数SetROP2相同功能的方法?
- 请教图像边界怎样用方向链码表示?
按你的方法,可以重复调用了,但是在自定义线程里调用的时候还是会出错
initole.cpp里面
CWinThread* pThread; pThread = AfxGetThread();
ASSERT(pThread);
这里的断言出错
但是在线程开启的时候,我通过一个按钮手动触发Excel操作的时候就没问题
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;
}
重复初始化的已经跳过了
AfxOleInit() 这里第一次初始化就报错了
CMyExcel m_excel; 一定要 放 堆栈 里?
另外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;
}
{
LPDISPATCH result;
InvokeHelper(0x23c, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);//这句报错
return result;
}
看看是什么错误。
Tech.exe 中的 0x7510812f 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0273f0d8 处的 COleException。
CoUninitialize
不知道是不是跟初始化与调用不在一个线程的关系如果把CMyExcel m_excel;放到函数里面一起接受线程调用就会变成另外一个错误,就是上面讲过的afxole()异常,
如果CMyExcel m_excel;作为成员在线程启动前就实例化,然后线程调用时就会m_excel.CreateExcelFile();出现异常
CWinThread* pThread; pThread = AfxGetThread();
ASSERT(pThread);
这里的断言出错是不是 Excel 界面 不存在 ?
不知道这里的pThread到底是指什么