VC++ ole对Excel进行操作,关闭后仍然有Excel进程驻留怎么解决

songxian43 2011-05-25 05:50:44
下面是我创建的Excel类,在打开创建sheet到关闭Excel,最后程序是关闭了,但是在进程中仍然有一个EXCEL进程驻留,搞了好久没找到怎么回事,求高手解答啊。。。


class CMyExcel
{
public:
CMyExcel(void);
virtual ~CMyExcel(VOID);

BOOL Initialization(VOID); //初始化Excel
VOID OpenExcleFile(TCHAR * Filename);//打开Excel文件
VOID CreatSheet(TCHAR * SheetName); //创建一个以参数命令的新页面
VOID SaveFile(VOID); //保存Excel文件
VOID CoUninitialize(VOID); //释放资源(相当重要!),并且退出程序

private:
CString m_cserrormessage; //错误信息

//excel操作对象
Range m_ExlRge;
_Worksheet m_ExlSheet;
Worksheets m_ExlSheets;
_Workbook m_ExlBook;
Workbooks m_ExlBooks;
_Application m_ExlApp;
Interior m_It;
Excel::Font m_Ft;

CMyExcel(const CMyExcel& myexcel);
CMyExcel & operator =(const CMyExcel& myexcel);
};
CMyExcel::CMyExcel(void)
{
}
CMyExcel::~CMyExcel(void)
{
}
BOOL CMyExcel::Initialization(void)
{
if(!m_ExlApp.CreateDispatch(_T("Excel.Application"),NULL))
{
m_cserrormessage = _T("创建Excel服务失败!");
return FALSE;
}
return TRUE;
}

//打开Excel文件
VOID CMyExcel::OpenExcleFile(TCHAR * Filename)
{
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
LPDISPATCH lpdisp;
m_ExlApp.SetVisible(TRUE);
m_ExlBooks = m_ExlApp.GetWorkbooks();
lpdisp = m_ExlBooks.Open(Filename,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional
);
m_ExlBook.AttachDispatch( lpdisp );
m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加载Sheet页面
}

//创建一个以参数命令的新页面
VOID CMyExcel::CreatSheet(TCHAR * SheetName)
{
m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);
m_ExlSheet.SetName(SheetName);
}

VOID CMyExcel::SaveFile(VOID)
{
m_ExlBook.SetSaved(TRUE);
m_ExlBook.Save();
}

//释放资源(相当重要!),并且退出程序
VOID CMyExcel::CoUninitialize(VOID)
{
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_ExlBook.Close(covOptional,covOptional,covOptional);
m_ExlBooks.Close();

m_ExlRge.ReleaseDispatch();
m_It.ReleaseDispatch();
m_Ft.ReleaseDispatch();
m_ExlSheet.ReleaseDispatch();
m_ExlSheets.ReleaseDispatch();
m_ExlBook.ReleaseDispatch();
m_ExlBooks.ReleaseDispatch();
m_ExlApp.Quit();
m_ExlApp.ReleaseDispatch();

}

...全文
492 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2011-07-28
  • 打赏
  • 举报
回复
m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
需要得到这个函数的返回值,然后将其ReleaseDispatch
龙哥依旧 2011-05-26
  • 打赏
  • 举报
回复
Excel是个com进程,用完后release计数为0就会自动退出


有些时候就是你手动运行的xls文件,关闭后进程也没有退出,要想研究出来为什么没啥意义也没必要,许是系统问题,呵呵

1、你试验下,你手动运行个xls,关闭后它退出不?

2、做个简单的程序只是运行个空的xls然后直接关闭,看退出不?

3、检测你的程序是否各个对象都ReleaseDispatch了!
songxian43 2011-05-26
  • 打赏
  • 举报
回复
经过测试发现在调用创建sheet函数后就会出现Excel驻留问题,其他函数都没有问题,不知道哪里调用不当导致。
//创建一个以参数命令的新页面
VOID CMyExcel::CreatSheet(TCHAR * SheetName)
{
m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);
m_ExlSheet.SetName(SheetName);
}
songxian43 2011-05-26
  • 打赏
  • 举报
回复
自己顶一个,别沉了。
songxian43 2011-05-26
  • 打赏
  • 举报
回复
我把整个过程简单化了点,我看都已经ReleaseDispatch,并且手动运行xls文件,关闭后进程退出了。在添加了sheet后就会有Excel进程驻留,不创建Sheet,直接在原有的sheet上操作就没有问题,一直找不到原因,求高手指教啊,急。。。

void test{

Range m_ExlRge;
_Worksheet m_ExlSheet;
Worksheets m_ExlSheets;
_Workbook m_ExlBook;
Workbooks m_ExlBooks;
_Application m_ExlApp;
Font ft;
Interior it;

if(!m_ExlApp.CreateDispatch(_T("Excel.Application"),NULL))
{
AfxMessageBox(_T("创建Excel服务失败!"));
return ;
}
m_ExlApp.SetVisible(TRUE);
m_ExlApp.SetUserControl(TRUE);
CString TempPath = _T("D:\\temp.xls");

LPDISPATCH lpDisp; //接口指针
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_ExlBooks = m_ExlApp.GetWorkbooks();
lpDisp = m_ExlBooks.Open(TempPath.GetBuffer(),
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional
);
TempPath.ReleaseBuffer();

m_ExlBook.AttachDispatch( lpDisp );
m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加载Sheet页面

m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);
m_ExlSheet.SetName(_T("r"));

m_ExlBook.SetSaved(TRUE);
m_ExlBook.Save();

m_ExlRge.ReleaseDispatch();
ft.ReleaseDispatch();
it.ReleaseDispatch();
m_ExlSheet.ReleaseDispatch();
m_ExlSheets.ReleaseDispatch();
m_ExlBook.ReleaseDispatch();
m_ExlBooks.ReleaseDispatch();
m_ExlApp.ReleaseDispatch();
m_ExlApp.Quit();
}

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧