描述:
这个程序是我参照这里做出来的:
http://yhchinabest.blog.163.com/blog/static/2900648520077331548893/
不是为什么。。我调用了Close()后,用进程管理器看,Excel还在运行的,有高手可
以解释下并给个方法我关了它么?
程序退出了,COM不在了,但如果别人多次操作的话。。会有10几个COM进程在无为占
着内存总不是一件好事吧。
如果要源码可以到这里拿
www.126.com
帐号:CSDNtest1
密码:CSDNtest
代码主要如下:
_Application oApp; //Excel进程对象
Workbooks oWorkbooks; //工作簿集合
_Workbook oWorkbook; //工作簿对象
Worksheets oWorksheets; //工作表集合
_Worksheet oWorksheet; //工作表
Range oRange; //代表某一单元格、某一行、某一列、
某一选定区域
void CMy1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString str1 = "c:\\CJWL081.xls";
char *buf1 = str1.GetBuffer(str1.GetLength());
NewApplication();
Open(buf1);
Read(1);
Close();
oWorksheet.ReleaseDispatch();
oApp.ReleaseDispatch();
oRange.ReleaseDispatch();
oWorkbooks.ReleaseDispatch();
oWorkbook.ReleaseDispatch();
oWorksheets.ReleaseDispatch();
CannotFindN.RemoveAll();
SearchName1.RemoveAll();
SearchName2.RemoveAll();
Name.RemoveAll();
FetionID.RemoveAll();
Telephone.RemoveAll();
Telephone1.RemoveAll();
}
void CMy1Dlg::NewApplication()
{
if (!oApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}
oWorkbooks=oApp.GetWorkbooks(); //获取当前工作簿集合
}
void CMy1Dlg::Open(char *pFilename)
{
oWorkbook=oWorkbooks.Open
(pFilename,vtMissing,vtMissing,vtMissing,vtMissing, //打开一个Excel文件
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMi
ssing,vtMissing,vtMissing); //并指定其为当前工作簿
}
void CMy1Dlg::Read(int Value)
{
oWorksheets=oWorkbook.GetWorksheets(); //获得工作表集合
oWorksheet=oWorksheets.GetItem(_variant_t((long)1)); //假定只有一张
表
oRange=oWorksheet.GetRange(_variant_t("A1"),vtMissing); //选择第一
列
_variant_t Value2=oRange.GetItem(_variant_t((long)1),_variant_t((long)1));
CString str = (LPCTSTR)_bstr_t(Value2);
MessageBox(str);
}
void CMy1Dlg::Close()
{
oWorkbook.Close(vtMissing,vtMissing,vtMissing); //关闭当前工作簿
oApp.Quit(); //退出进程
}
解决方案1:
我今天测试了下,是因为Range对象GetItem返回值还是一个Range对象,而这个对象你没有释放。正确的做法是:
void COfficeTestDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
CApplication oApp;
oApp.CreateDispatch(_T("Excel.Application"));
CWorkbooks books;
books = oApp.get_Workbooks();
CWorkbook book;
book = books.Open(_T("E:\\test.xls"), vtMissing,vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing );
CWorksheets sheets;
sheets = book.get_Worksheets();
CWorksheet sheet;
sheet = sheets.get_Item(_variant_t((LONG)1));
CRange range;
range = sheet.get_Range(_variant_t("B4"),vtMissing);
CRange rangV;
rangV.AttachDispatch(range.get_Item(_variant_t((LONG)1), _variant_t((LONG)2)).pdispVal);
_variant_t value = rangV.get_Value2();
rangV.ReleaseDispatch();
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.Close();
books.ReleaseDispatch();
oApp.Quit();
oApp.ReleaseDispatch();
//OnOK();
}
我用VS2003测试的,可以在导入类与你的VC6有差别,但原理是一样的,你自己改改就行了.