VC6.0+Office

步履人生 2008-02-17 12:57:02
在使用VC6.0做Office程序的时候,在调用_Application的成员函数Quit()之后怎么在任务管理器还是能看到有Excel应用程序存在呢?如果不结束掉这个Excel进程,在再次启动Excel应用程序之后,导致打开其他Excel文件后只能显示菜单以及工具栏,而文件数据无法显示。
郁闷,不知道是什么地方出了问题,请大家指点!!!
...全文
192 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LILY136668 2009-08-18
  • 打赏
  • 举报
回复
按下面顺序调用即可:
app.Quit();
app.ReleaseDispatch();
输询不可反,否则进程不能消除。
步履人生 2008-07-20
  • 打赏
  • 举报
回复
反正不知道是什么原因,有可能是Excel版本的原因,我安装了Office2003之后这个问题得到了解决。不过还是比较疑惑!!!
步履人生 2008-02-26
  • 打赏
  • 举报
回复
_Application有这个Release嘛?
dfpgb 2008-02-26
  • 打赏
  • 举报
回复
你试用Release()了吗啊


很明显啊,我是菜鸟
步履人生 2008-02-26
  • 打赏
  • 举报
回复

// 我的类函数
CExcel::CExcel()
{

}

CExcel::~CExcel()
{
m_sheets.DetachDispatch();
m_sheet.DetachDispatch();
m_workbook.DetachDispatch();
m_workbooks.DetachDispatch();
m_app.DetachDispatch();

m_sheet.ReleaseDispatch();
m_sheets.ReleaseDispatch();
m_workbook.ReleaseDispatch();
m_workbooks.ReleaseDispatch();
m_app.ReleaseDispatch();
}

// 功能:启动Excel应用程序并设置m_workbooks
// 参数:(无)
// 返回:如果成功则返回TRUE,否则返回FALSE;
// 说明:该函数影响成员数据m_app, m_workbooks的值;
BOOL CExcel::OpenApp()
{
if(m_app) return TRUE;
if(!m_app.CreateDispatch(_T("Excel.Application")))
{
return FALSE;
}

// m_app.ReleaseDispatch(); -->如果在此调用就可以让Excel退出,否则不行。
return TRUE;
}

void CExcel::QuitApp()
{
m_app.Quit();
}



// 我的调用过程
void CDemoDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CExcel xls;
if(xls.OpenApp())
{
xls.QuitApp();
}
}
步履人生 2008-02-26
  • 打赏
  • 举报
回复
刚才试过了,如果将_Application的ReleaseDispatch与_Application的CreateDispatch放在同一过程中就可以让Excel应用程序从任务管理器中退出,如果将两个函数的调用放在不同的过程中就不行,不知道为什么,请大家指点!!

顺便说一下,我是做了一个操作Excel的类,我不可能在同一个过程中调用这两个函数,请大家帮忙解决一下,谢了!!!
步履人生 2008-02-24
  • 打赏
  • 举报
回复
不是用ReleaseDispatch()释放吗?难道还有其他的方法?
mr.zhoux 2008-02-22
  • 打赏
  • 举报
回复
资源没彻底释放干净,打开一个对象都必须去手动释放,不会自动释放的.
步履人生 2008-02-22
  • 打赏
  • 举报
回复
void CDemoDlg::OnButton2()
{
Excel::_Application m_app; // Excel 应用程序;
Excel::Workbooks m_workbooks; // Excel文档集;
Excel::_Workbook m_workbook; // 文档;
Excel::Sheets m_sheets; // 表格集;
Excel::_Worksheet m_sheet; // 工作表;

// 打开Excel应用程序
if(m_app) return;
if(!m_app.CreateDispatch(_T("Excel.Application")))
{
ASSERT(0);
return;
}

// 设置m_workbooks;
m_workbooks.AttachDispatch(m_app.GetWorkbooks(),TRUE);

if(m_app) m_app.SetVisible(TRUE); // 显示Excel应用程序;

ASSERT(m_workbooks);

// 打开一个Excel文件
m_workbook.DetachDispatch();
m_workbook.AttachDispatch(m_workbooks.Open("E:\\TestFile.xls",
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing),TRUE);

// 设置m_sheets, 注意只能开一个Excel工作簿;
m_sheets.AttachDispatch(m_workbook.GetWorksheets(),TRUE);

// 退出Excel
m_app.Quit();

// 释放所有应用对象
m_sheets.DetachDispatch();
m_sheet.DetachDispatch();
m_workbook.DetachDispatch();
m_workbooks.DetachDispatch();
m_app.DetachDispatch();

m_sheet.ReleaseDispatch();
m_sheets.ReleaseDispatch();
m_workbook.ReleaseDispatch();
m_workbooks.ReleaseDispatch();
m_app.ReleaseDispatch();
}
步履人生 2008-02-22
  • 打赏
  • 举报
回复
我在Word中使用同样 的方法可以让Word退出啊,怎么到Excel中就不行了呢?不解。
应该不是“不可以使用AttachDispatch和DetachDispatch,直接用=赋值”吧

帮忙看看
dfpgb 2008-02-20
  • 打赏
  • 举报
回复
应该要调用各个对象的Release()吧?


很明显啊,我是菜鸟
shulei521 2008-02-20
  • 打赏
  • 举报
回复
软件破解群35780346
从事专业软解破解 软件逆向 精通汇编,精通静态 动态的调试工具,
供大家交流学习。
jameshooo 2008-02-20
  • 打赏
  • 举报
回复
不可以使用AttachDispatch和DetachDispatch,直接用=赋值
步履人生 2008-02-19
  • 打赏
  • 举报
回复
是的,我是调用了所有对象的ReleaseDispatch()。但是寒士有问题啊,请大家帮忙看看是是什么地方出了问题。
我的代码如下:
void CDemoDlg::OnButton2()
{
Excel::_Application m_app; // Excel 应用程序;
Excel::Workbooks m_workbooks; // Excel文档集;
Excel::_Workbook m_workbook; // 文档;
Excel::Sheets m_sheets; // 表格集;
Excel::_Worksheet m_sheet; // 工作表;

// 打开Excel应用程序
if(m_app) return;
if(!m_app.CreateDispatch(_T("Excel.Application")))
{
ASSERT(0);
return;
}

// 设置m_workbooks;
m_workbooks.AttachDispatch(m_app.GetWorkbooks(),TRUE);

if(m_app) m_app.SetVisible(TRUE); // 显示Excel应用程序;

ASSERT(m_workbooks);

// 打开一个Excel文件
m_workbook.DetachDispatch();
m_workbook.AttachDispatch(m_workbooks.Open("E:\\TestFile.xls",
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,
vtMissing,vtMissing,vtMissing,vtMissing),TRUE);

// 设置m_sheets, 注意只能开一个Excel工作簿;
m_sheets.AttachDispatch(m_workbook.GetWorksheets(),TRUE);

// 退出Excel
m_app.Quit();

// 释放所有应用对象
m_sheets.DetachDispatch();
m_sheet.DetachDispatch();
m_workbook.DetachDispatch();
m_workbooks.DetachDispatch();
m_app.DetachDispatch();

m_sheet.ReleaseDispatch();
m_sheets.ReleaseDispatch();
m_workbook.ReleaseDispatch();
m_workbooks.ReleaseDispatch();
m_app.ReleaseDispatch();
}

jameshooo 2008-02-18
  • 打赏
  • 举报
回复
程序中所有对_Application的引用变量都要调用Release,否则还是没有释放干净。
步履人生 2008-02-18
  • 打赏
  • 举报
回复
在调用完之后,还调用了_Application的ReleaseDespatch(),可还是不能退出Excel应用程序,除非我的程序全部退出,Excel才不会出现在任务管理器里。
duanhuicen 2008-02-18
  • 打赏
  • 举报
回复
各位有没有关于用vc开发office相关的技术资料啊?
比如用vc如何生成doc、xls文件等。
先谢过了。
willing@foxmail.com
jameshooo 2008-02-17
  • 打赏
  • 举报
回复
光调用Quit是不够的,你获得的Excel的接口指针还要Release才行,这样才能让Excel退出。
另外,由于Excel是一个进程外组件,Excel的退出会有一定的延时,意思就是:即使你的程序正常释放了对Excel的引用,Excel进程可能也得花数秒的时间来退出。
arong1234 2008-02-17
  • 打赏
  • 举报
回复
COM服务器退出前必须确保所有依赖于它的COM对象已经被释放了,否则该服务器不能退出

因此你可能还有啥和Excel相关的对象引用计数不为0,这个从Quit是看不出的,只有你自己去好好查代码了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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