vc excel Quit 无法关闭excel进程,急啊!!!!!

dahong12345 2012-05-07 05:41:23
退出代码如下:
m_shapes.DetachDispatch();
m_shapes.ReleaseDispatch();

m_ExlRge.DetachDispatch();
m_ExlRge.ReleaseDispatch();

m_ExlSheet.DetachDispatch();
m_ExlSheet.ReleaseDispatch();

m_ExlSheets.DetachDispatch();
m_ExlSheets.ReleaseDispatch();

m_ExlBook.Close(covOptional, covOptional, covOptional);
m_ExlBook.DetachDispatch();
m_ExlBook.ReleaseDispatch();

m_ExlBooks.Close();
m_ExlBooks.DetachDispatch();
m_ExlBooks.ReleaseDispatch();

m_ExlApp.Quit();
m_ExlApp.DetachDispatch();
m_ExlApp.ReleaseDispatch();
excel关闭后,excel的进程为什么还不能退出啊,我前面使用了Sheets.GetItem函数,但没有使用Range.GetItem,为什么还是退不出啊???
...全文
802 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rhce200791 2014-08-20
  • 打赏
  • 举报
回复
三楼正解,谢谢。
lkx343 2013-08-22
  • 打赏
  • 举报
回复
3楼的方法可以解决,我调用Release()后excel进程退出了
liying426 2013-03-29
  • 打赏
  • 举报
回复
我也遇到这个问题了 还没成功解决
laoyingyzp 2012-05-22
  • 打赏
  • 举报
回复
怎么没人回答??
自己先顶一下!
laoyingyzp 2012-05-21
  • 打赏
  • 举报
回复
谢谢楼上的回答,但是我的还是不行,我把代码贴出来,大家帮看一下,谢谢。
编译环境为VS2010,Excel为2010!
CString FilePathName;
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("EXCEL文件(*.xls;*.xlsx)|*.xls;*.xlsx||"),AfxGetMainWnd());
///TRUE为OPEN对话框,FALSE为SAVE AS对话框

//dlg.m_ofn.lpstrFileTitle=_T("打开图像文件...\0");
//dlg.m_ofn.lpstrFilter=_T("Excel(*.xls)|*.xls");

if(dlg.DoModal()==IDOK)
{

FilePathName=dlg.GetPathName();
CApplication app;
CWorkbook book;
CWorkbooks books;
CRange range;
CWorksheets sheets;
CWorksheet sheet;
COleException* pe = new COleException;
if (!app.CreateDispatch(_T("Excel.Application"),pe))
{
MessageBox(_T("Error!Creat Excel Application Server Faile!"));
exit(1);
}
app.put_Visible(true);

//books.AttachDispatch(app.get_Workbooks(),true);
//book.AttachDispatch(books.Add(_variant_t(strPath)));
books = app.get_Workbooks();
book = books.Add(_variant_t(FilePathName));


//得到Worksheets
int num_Sheel;

sheets.AttachDispatch(book.get_Worksheets());
num_Sheel=sheets.get_Count();
sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1)));
range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("A1")));
_variant_t var;
CString strResult;
int i,j;
i=1;
j=1;

var=range.get_Item(_variant_t(i),_variant_t(j));


range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();

//结尾,释放
COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
book.Close(covFalse,covOptional,covOptional);
books.Close();
pe->Delete();

book.ReleaseDispatch();
books.ReleaseDispatch();
app.Quit();
app.ReleaseDispatch();

MessageBox(_T("完成"),_T("提示"),MB_OK);
}
dahong12345 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

楼上的,是怎么解决的,我也遇到了这个问题,谢谢!
[/Quote]

参考三楼的
laoyingyzp 2012-05-18
  • 打赏
  • 举报
回复
楼上的,是怎么解决的,我也遇到了这个问题,谢谢!
dahong12345 2012-05-09
  • 打赏
  • 举报
回复
感谢大家的回帖,问题已经得到解决了!
诶呦 2012-05-08
  • 打赏
  • 举报
回复
LZ给我留言了是吧
如1楼所说DetachDispatch()是不需要的。
我说下我的具体原因,不一定符合你的程序:
1.有些操作都会产生变量,所以要接受其返回值,并在最后要释放;
如:lpDisp=usedRange.GetRows();
lpDisp->Release();
usedRange.GetRows();这么写相当于有些变量没有release
2.relsease的顺序问题:
book.Close(covOptional,COleVariant(strPathName),covOptional);
books.Close();
book.ReleaseDispatch();
books.ReleaseDispatch();
我的问题出在于先book.ReleaseDispatch();然后才book.Close();
如果先book.ReleaseDispatch()的话(相当于book对象已经ReleaseDispatch()),那么当然book.Close();也就无效了。所以检查一下你的调用顺序问题。

跟有没有使用Range.GetItem()没有关系
patrick_880520 2012-05-08
  • 打赏
  • 举报
回复
因为你对excel做了修改,退出前它会问你是否需要保存
redui 2012-05-07
  • 打赏
  • 举报
回复
所有DetachDispatch()调用都是多余的,楼主知道它的含义么?

二话不说,先删掉这些调用,然后再执行一遍,然后观察任务管理器,等待若干秒,看看EXCEL会不会退出。

16,471

社区成员

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

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

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