• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 为什么调用了Close后,进程还是没有关闭的?

为什么调用了Close后,进程还是没有关闭的?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了录close关闭目录,close关闭,目录close关闭目录,window.close直接关闭,程目录close关闭目录等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 为什么调用了Close后,进程还是没有关闭的?
描述:

这个程序是我参照这里做出来的:
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:

引用 21 楼 grimangel 的回复:
多谢楼上的继续帮助,你的方法很好,让我知道了哪里出现让Excel不能退出的地方:
 当这句出现时就不能退出Excel了
 _variant_t Value2=oRange.GetItem(_variant_t((long)1),_variant_t((long)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有差别,但原理是一样的,你自己改改就行了.


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 为什么调用了Close后,进程还是没有关闭的?

相关文章

  • 2017-06-05 如何给一个线程设定时器?(100分)
  • 2017-06-04 VB中的“SetOption2Container=Frame1”在VC如何表达?
  • 2017-06-04 介绍本了解IE内部工作原理的书吧,主要想知道IE内部如何使用IHTML打头的众多COM对象
  • 2017-06-04 IDL中的dual关键字。
  • 2017-06-05 哪位大虾能告诉我如何在两个进程间通信。
  • 2017-06-04 如何定义已知GUID到文件中?
  • 2017-06-05 线程同步问题,主线程利用变量是否为真,无限循环等待线程结束,运行结果死机,代码如下
  • 2017-06-04 COM句柄泄漏问题
  • 2017-06-04 ATL做的ActiveX控件,加入了属性页,为什么在VB中点右键没有属性一项
  • 2017-06-05 谁能够谈谈单线程异步模式和多线程同步编程模式?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何开多个线程同时向同一个文件写入数据
    • 串口通信协议控件mscomm的学习
    • 关于如何使用这个RegCreateKeyEx函数????
    • 进程防杀方法,大家来说说
    • 被调用的dll如何共享主程序中的全局数据?
    • 有谁用线程编过winsock的接收文件和发送文件
    • 自己写的ActiveX在IE加载时出现问题
    • 谁知道winnt中进程"systemidleprocess"是什么?
    • 怎样对activex控件签名,使其标记为安全?
    • 哪位大侠对视频捕获有过研究?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有