之前一直用ODBC的方式操作EXCEL文件,但是在程序运行过程中不断写入文件,程序就直接退出,没有任何提示信息。我就这段代码做一个按钮进行文件写入就是正常的,可惜采用了RELEASE方式的OBJ文件导致了无法进行DEBUG,所以打算放弃ODBC操作EXCEL文件的方式,在采用直接操作EXCEL文件的方式,出现代码运行就弹出“0X5F58A35A 指令引用的 0xCCCCCCCC 内存。该内存不能为 read”,请问是怎么回事。我的环境如下:1.本机安装office 2007;2.用class wizard添加了excel.h和excel.cpp,
在dlg.h中添加了_Application m_oExcelApp;
_Worksheet m_oWorkSheet;
_Workbook m_oWorkBook;
Workbooks m_oWorkBooks;
Worksheets m_oWorkSheets;
Range m_oCurrRange;在添加了dlg.cpp中的OnInitDialog()中添加了if(CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化com支持库失败");
exit(1);
}
if(!m_oExcelApp.CreateDispatch(_T("EXCEL.Application"),NULL))
{
::MessageBox(NULL,_T("创建Excel服务失败!"),_T("错误提示!"),MB_OK|MB_ICONERROR);
}
m_oExcelApp.SetVisible(false);
m_oWorkSheets.AttachDispatch(m_oExcelApp.GetWorkbooks(),TRUE);
在button函数中添加了LPDISPATCH lpDisp=NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)TRUE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
Range oCurrCell;
lpDisp=m_oWorkBooks.Open("D:\\excel_test\test.xls",
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing)
);
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得活动的WorkSheet( 工作表 )
m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
// 获得使用的区域Range( 区域 )
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
// 获得使用的行数
long lgUsedRowNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
lgUsedRowNum = m_oCurrRange.GetCount();
// 获得使用的列数
long lgUsedColumnNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
lgUsedColumnNum = m_oCurrRange.GetCount();
// 读取Sheet的名称
CString strSheetName = m_oWorkSheet.GetName();
//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );
在dlg.h中添加了_Application m_oExcelApp;
_Worksheet m_oWorkSheet;
_Workbook m_oWorkBook;
Workbooks m_oWorkBooks;
Worksheets m_oWorkSheets;
Range m_oCurrRange;在添加了dlg.cpp中的OnInitDialog()中添加了if(CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化com支持库失败");
exit(1);
}
if(!m_oExcelApp.CreateDispatch(_T("EXCEL.Application"),NULL))
{
::MessageBox(NULL,_T("创建Excel服务失败!"),_T("错误提示!"),MB_OK|MB_ICONERROR);
}
m_oExcelApp.SetVisible(false);
m_oWorkSheets.AttachDispatch(m_oExcelApp.GetWorkbooks(),TRUE);
在button函数中添加了LPDISPATCH lpDisp=NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)TRUE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
Range oCurrCell;
lpDisp=m_oWorkBooks.Open("D:\\excel_test\test.xls",
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing)
);
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得活动的WorkSheet( 工作表 )
m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
// 获得使用的区域Range( 区域 )
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
// 获得使用的行数
long lgUsedRowNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
lgUsedRowNum = m_oCurrRange.GetCount();
// 获得使用的列数
long lgUsedColumnNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
lgUsedColumnNum = m_oCurrRange.GetCount();
// 读取Sheet的名称
CString strSheetName = m_oWorkSheet.GetName();
//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );
解决方案 »
- 求助,写远控时截到的屏幕不知道怎么在控件对话框中显示
- C++ MFC 软件界面 之类的一些问题,求助
- 请问用CHTMLView,如果自定义<input type=file>点击弹出的文件选择器的filter
- windbg调试驱动的配置问题
- MSMQ的IMSMQTransactionPtr怎么转换为VARIANT*啊?
- 对话框中用了属性页,在属性页中的按钮,如何结束对话框。
- Dll中加载ActiveX控件的问题(新...)
- 大虾!就命!怎样在多文档程序中使用自己的工具条
- First-chance exception in SafeMail.exe (KERNEL32.DLL): 0xC0000005: Access Violation
- 求救:如何在vc中自动控制office组件?
- 怎么求图像文档的大小
- MFC如何生成prn文件(打印机)
CString strPath;
_Application xlsapp; //应用程序
Workbooks xlsbooks; //工作簿组
_Workbook xlsbook; //工作簿
Worksheets xlssheets; //工作表表
_Worksheet xlssheet; //工作表
Range xlsrange, //行
xlscell, //单元格
usedRange; //使用的行
LPDISPATCH lpDisp; //事件响应参数
COleVariant vResult((long)1, VT_I4); //公用OLE变体
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); ////////////////////////////////Excel Operate Start
//开始excel,获得应用程序对象。
if(!xlsapp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Couldn't start Excel and get an application 0bject");
return 0;
} //设置可见性
xlsapp.SetVisible(FALSE); //设置应用程序不可见
xlsapp.SetUserControl(FALSE); xlsbooks.AttachDispatch(xlsapp.GetWorkbooks()); //取得工作簿集合 // Open a workbook.
//打开文件(一个工作簿)
lpDisp = xlsbooks.Add(covOptional);
ASSERT(lpDisp); //It should have worked.
xlsbook.AttachDispatch(lpDisp); // Attach to a Workbook object.
lpDisp = xlsbook.GetSheets();
xlssheets.AttachDispatch(lpDisp); m_strStat="状态:正在保存脚本制作环节表格...";
UpdateData(FALSE); lpDisp = xlssheets.GetItem( COleVariant((short)(1)) );
xlssheet.AttachDispatch(lpDisp);
xlssheet.SetName("脚本制作"); i=1;
for(j='A'; j<'I'; j++)
{
sprintf(pcTmp,"%c%d",j, i);
xlsrange = xlssheet.GetRange(COleVariant(pcTmp),COleVariant(pcTmp));
if(j=='A')
xlsrange.SetValue2(COleVariant("第一列,第一行"));
//...................
} GetCurrentDirectory(MAX_PATH, pcColumn);
strcat(pcColumn, "\\test.xls");
xlsbook.SaveAs(COleVariant(pcColumn), //VA_FileName,
covOptional, //VA_FileFormat,
covOptional, //VA_Password,
covOptional, //VA_WriteResPassword,
covOptional, //VA_ReadOnlyRecommended,
covOptional, //VA_CreateBackup,
0, //long_AccessMode,
covOptional, //VA_ConfilictResolution,
covOptional, //VA_AddToMru,
covOptional, //VA_TextCodepage,
covOptional, //VA_TextVisualLayOut,
covOptional); //VA_Local); xlsbook.Close(covFalse,COleVariant(""),covFalse);
xlsbooks.Close();
xlsapp.Quit();