PowerPoint二次开发-无法关闭进程

guolinchao 2008-02-01 08:51:58
Microsoft.Office.Interop.PowerPoint.ApplicationClass appClass = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();

Microsoft.Office.Interop.PowerPoint.Presentation pres = pptApp.appClass.Presentations.Open(FileName,Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);

pres.Close();
appClass.Quit();

结果PowerPoint进程仍然存在,并且被打开的ppt文件无法打开,只有把进程终止后,才能打开。
...全文
792 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
NormanZL 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

Microsoft.Office.Interop.PowerPoint.ApplicationClass appClass = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();

Microsoft.Office.Interop.PowerPoint.Presentation pres = pp……
[/Quote]


目前也用这种方法,但是进程中依然残留ppt进程。

高人在哪?
leishangwen 2012-03-30
  • 打赏
  • 举报
回复
遇到同样的问题啊,求解决措施
gucheng0822 2011-05-31
  • 打赏
  • 举报
回复
我按lake_cx的方法还是不行……
wzlsy 2010-01-15
  • 打赏
  • 举报
回复
我也遇到同样的问题。。。。。
lake_cx 2008-02-02
  • 打赏
  • 举报
回复
有没有试过把接口释放掉。。。
例如你把接口放在某个类中的成员变量中,你就把这个类释放或者成员变量置空。然后执行垃圾回收。

因为在Office的OLE操作中,COM服务器会维护接口的引用计数,用_AddRef和_Release来维护,映射到高级语言中则变成了,你将一个接口引用赋值时会自动调用_AddRef和_Release,而直到COM直到你一个接口引用都没有的时候才会释放服务器资源。

具体我没有试,只是说有可能是这个原因。
lake_cx 2008-02-02
  • 打赏
  • 举报
回复
PowerPoint.ApplicationClass appClass = new PowerPoint.ApplicationClass();
appClass.Presentations.Open("F:\\a.ppt", Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
appClass.Quit();
GC.Collect();

这样就行了。。。
guolinchao 2008-02-02
  • 打赏
  • 举报
回复
用同样的方法,在word就不会出现这样的问题。
guolinchao 2008-02-02
  • 打赏
  • 举报
回复
Microsoft.Office.Interop.PowerPoint.ApplicationClass appClass = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();

Microsoft.Office.Interop.PowerPoint.Presentation pres = pptApp.appClass.Presentations.Open(FileName,Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);

pres.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(pres);//COM的引用计数减少
pres = null;

appClass.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(appClass);//COM的引用计数减少
appClass = null;

GC.Collect();

这样写,问题仍然没有解决。
guolinchao 2008-02-01
  • 打赏
  • 举报
回复
按照“cocosoft”的提示,先获取PowerPoint的Id,打开PowerPoint后再重新获取Id,两个Id数组进行比较,选出新的Id,然后用System.Diagnostics.Process.GetProcessById().Kill()来终止掉,试了几次后发现,当已经打开了PowerPoint后,再执行代码时就会失败,提示:

检索 COM 类工厂中 CLSID 为 {91493441-5A91-11CF-8700-00AA0060263B} 的组件时失败,原因是出现以下错误: 80080005。
guolinchao 2008-02-01
  • 打赏
  • 举报
回复
我用了
System.Diagnostics.Process.GetProcessById(appClass.HWND).Kill();
来强制终止进程,提示“ID 为 328756 的进程当前未运行”,我想可能是因为启用了PowerPoint的COM,然后COM去再启用PowerPoint进程,所以找不到进程,但是这个appClass.HWND又是什么意思呢?
wwlprince 2008-02-01
  • 打赏
  • 举报
回复
没做过,UP
甴曱 2008-02-01
  • 打赏
  • 举报
回复
一般应用Office类的,只能先取它的当前id,通过id进行进程的Kill完成终止
先取出所有PowerPoint的进程,并将它们的进程id以列表或者其他方式保存,在调用的时候,再取一次,将当前进程的id取出.然后通过id完成进程的终止.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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