描述:
在VC中操作Excel,完成多个sheet的报表,生成报表后使Excel可见,方便观看生成的报表。程序中不关闭Excel进程,等用户看完报表后手动关闭Excel。但是在手动关闭时出错如下:
---------------------------
EXCEL.EXE - 应用程序错误
---------------------------
"0x30033ac2" 指令引用的 "0x650918d8" 内存。该内存不能为 "read"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
请大侠们帮忙诊断一下!
_ApplicationPtr app;//("Excel.Application");
HRESULT hr = S_OK;
CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
app.CreateInstance(clsid);
WorkbooksPtr books;
_WorkbookPtr book;
long lcid =LOCALE_USER_DEFAULT;
SheetsPtr sheets;
app->get_Workbooks(&books);
book = books->Add(covOptional,lcid);
book->get_Worksheets(&sheets);
IDispatchPtr pDisp;
{
sheets->get_Item(_variant_t((short)1),&pDisp);
_WorksheetPtr sheet(pDisp);
sheet->PutName("AAA");
......
}
{
sheets->get_Item(_variant_t((short)2),&pDisp);
_WorksheetPtr sheet(pDisp);
sheet->PutName("AAA");
......
}
app->put_AskToUpdateLinks(lcid,VARIANT_FALSE);
app->put_AlertBeforeOverwriting(lcid,VARIANT_FALSE);
app->put_UserControl(VARIANT_FALSE);
app->put_DisplayAlerts(0,VARIANT_FALSE);
app->PutVisible(0,VARIANT_TRUE);
LPCTSTR file_name = strExcelFile;
_variant_t varfilename(file_name);
DeleteFile(file_name);
HRESULT hrMethod = book->SaveAs(varfilename,covOptional,covOptional,covOptional,covOptional,covOptional,xlNoChange,vtMissing,vtMissing,vtMissing,vtMissing,0l);
book->put_Saved(0,VARIANT_TRUE);
// 如果使用下面注释的代码在程序中关闭Excel进程,则不会出错。很郁闷呀!
/* book->Close(COleVariant(VARIANT_FALSE),vtMissing,vtMissing,0);
books->Close(0);
app->Quit();
//*/
解决方案1:
是因为模块退出时,_Application实例已经销毁了,
不用智能指针 _ApplicationPtr,用接口指针,或者在 _ApplicationPtr 实例化后,增加一个引用计数