正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接

时间:2022-08-09 20:25:09

本来form method=post本页面

修改为其他页面 action=save.aspx后没问题

其他问题可参考以下:

引自:http://topic.csdn.net/u/20090108/17/f240cd4d-72cf-44bc-851e-cc587dd7e468.html



源问题:

详细内容: 

System.Runtinm.InteropServices.COMException 

被调用的对象已与其客户端断开连接。 (异常来自 HRESULT:0x80010108 (RPC_E_DISCONNECTED)) 

ErrorCode:-2147417848 

Souce:Interop.Word 

StackTrace:" 在 Word.ApplicationClass.Quit(Object& SaveChanges, Object& OriginalFormat, Object& RouteDocument)\r\n 在 WordOPTools.OpWord(Object& fileName,
Boolean issafe, String newpath)" 



当处理的word内容比较大的时候报这个异常. 

还请各位多多帮忙解决一下这个问题. 





解决方法:



object nothing=System.Reflection.Missing.Value; 

object optional=System.Reflection.Missing.Value; 

object visible=true; 

object saveChanges = true; 

object NOTsaveChanges = false; 

object docreadonly=true; 

object originalFormat = System.Reflection.Missing.Value; 

object routeDocument =System.Reflection.Missing.Value; 

Word.ApplicationClass app=new Word.ApplicationClass(); 

object Fi=page.Server.MapPath(strC+"Template_temp/"+FileName); 

Word.Document Doc=app.Documents.Open(ref Fi,ref optional,ref docreadonly,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional,ref
optional,ref optional, ref visible); 







Doc.SaveAs(ref strFileName,ref optional, ref optional, ref optional,ref optional, ref optional, ref optional,ref optional, ref optional, ref optional, ref
optional); 

Doc.Close(ref NOTsaveChanges, ref originalFormat, ref routeDocument); 

app.Quit(ref NOTsaveChanges, ref originalFormat, ref routeDocument); 

System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 

System.Runtime.InteropServices.Marshal.ReleaseComObject(Doc); 

app=null; 

Doc=null; 

GC.Collect(); 

GC.Collect();



--------------------------------------------------------------

补充

------------摘自:http://blogs.geekdojo.net/richardhsu/archive/2003/11/14/281.aspx



Working with COM Exe in C#

Credit goes to Peter A. Bromberg for this one. In his article, he talks about creating dynamic excel workbooks in C# within an ASP.NET page.

What I learnt from the article was how we can properly release a COM object. There are two methods that we are gets the deallocation done. They are :-

1) GC.Collect(); // this one forces garbage collection

2) System.Runtime.InteropServices.Marshal.ReleaseComObject (object); // this one releases the passed in COM object wrapper instance

The pattern the author (Peter A. Bromberg) uses to create and release COM Wrapped Excel objects is :-

1) call GC.Collect() to force collection of existing COM Objects waiting to be released.

2) instantiate the COM Wrapped Excel objects (Workbook, Worksheet etc.)

3) do the thing... 

4) call the Close() or Quit() methods on the objects when done.

5) call System.Runtime.InteropServices.Marshal.ReleaseComObject(object) once for each COM object created.

6) set each object variable to null.

7) call GC.Collect() again

8) be relieved and reminisce the cool VB6 way of doing the above (Set obj = Nothing)

Here is a slightly altered & annotated code fragment (in C#) that shows how it is done :-

Excel.Application oXL;

Excel._Workbook oWB;

Excel._Worksheet oSheet;

// Step 1

GC.Collect();// clean up any other excel guys hangin' around...

// Step 2

oXL = new Excel.Application();

oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));

oSheet = (Excel._Worksheet)oWB.ActiveSheet;

// Step 3

// this part will actually be filling in the values into the sheet

fillValues(oSheet);

....

// Step 4

// Need all following code to clean up and extingush all references!!!

oWB.Close(null,null,null);

oXL.Workbooks.Close();

oXL.Quit();

// Step 5

System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);

// Step 6

oSheet=null;

oWB=null;

oXL = null;

// Step 7

GC.Collect(); // force final cleanup!

Although I am yet to fully understand what goes on behind the scenes, I have used the above mention pattern, and it works. Excel exposes its functionality through a COM Exe. Maybe, we don't need to do all this for a COM Dll, but that is for later.

Published Friday, November 14, 2003 5:08 PM by richardhsu 

Filed Under: Office
- VBA
C#

正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接的更多相关文章

  1. Qt Quick 组件和动态创建的对象具体的解释

    在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...

  2. 为什么new的普通数组用delete 和 delete&lbrack;&rsqb;都能正确释放

    由同事推荐的一篇博客: 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader 文章解释了delete 内 ...

  3. ArcGIS Engine中正确释放打开资源

    转自原文 ArcGIS Engine中正确释放打开资源 AE中对MDB,SDE等数据库操作时,打开后却往往不能及时释放资源,导致别人操作提示对象被锁定. 很多帖子说了很多原理,看的也烦且不实用,比如一 ...

  4. &period;NET平台开源项目速览&lpar;14&rpar;最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  5. &period;NET平台开源项目速览&lpar;2&rpar;Compare &period;NET Objects对象比较组件

    .NET平台开源项目速览今天介绍一款小巧强大的对象比较组件.可以更详细的获取2个对象的差别,并记录具体差别,比较过程和要求可以灵活配置. .NET开源目录:[目录]本博客其他.NET开源项目文章目录 ...

  6. &period;NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践

    心情小札:近期换了工作,苦逼于22:00后下班,房间一篇狼藉~ 小翠鄙视到:"你就适合生活在垃圾堆中!!!" 晚上浏览博客园 看到一篇非常实用的博客:.NET平台开源项目速览(14 ...

  7. Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。

    #pragma strict function Awake(){ //载入一个预制体 资源必须在 Resources目录下 Resources.LoadLoad(); //载入后 必须演示样例化 Ga ...

  8. Tiny Mapper是一个&period;net平台开源的对象映射组件

    NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper   阅读目录 1.Tiny Mapper基本介绍 2.Tiny Mapper 基本使用 3.Tiny Mapper 指定配置使用 ...

  9. Compare &period;NET Objects对象比较组件

    Compare .NET Objects对象比较组件 阅读目录 1.Compare .NET Objects介绍 2. Compare .NET Objects注意事项 3.一个简单的使用案例 4.三 ...

随机推荐

  1. Learning Roadmap of Deep Reinforcement Learning

    1. 知乎上关于DQN入门的系列文章 1.1 DQN 从入门到放弃 DQN 从入门到放弃1 DQN与增强学习 DQN 从入门到放弃2 增强学习与MDP DQN 从入门到放弃3 价值函数与Bellman ...

  2. WIN32 根据程序名&lpar;映像名称&rpar;终止外部程序

    场景: 1.有时候需要调用外部程序,但是外部程序有可能崩溃挂起,这样这个进程就没法结束,所以再在下次调用前需要先结束之前调用的. 2.没考虑到权限问题,应该是只能终止当前用户启动的进程. #inclu ...

  3. redis 源码分析

    参考: http://redisbook.readthedocs.org/en/latest/index.html http://www.databaseskill.com/3421161/ The ...

  4. monkey命令详解

    标准的monkey 命令 adb shell monkey [options] <eventcount> 例如: adb shell monkey -v    产生500次随机事件,作用在 ...

  5. 《类型编程晋级——shapeless类库使用指南》前言及第一章翻译

    从年初开始进行此项工作,我和合作伙伴包亮付出了大量而艰辛的劳动,现基本翻译完毕,有出版意向,如果有意向欢迎联系,不甚感激!也欢迎各位博友对此翻译提出意见建议以及指导如何出版,在此谢过! 前言 时间回到 ...

  6. 【Ruby on Rails】Model中关于保存之前的原值和修改状态

    今天在Rails的Model中遇到了一个问题—— 当我从Model类中获取了一个ActiveRecord对象,对其进行了一系列修改(尚未保存),我该如何确定究竟哪些修改了呢? (设Model为Opti ...

  7. datagrid参数queryParams--easyUI

    datagrid参数queryParams--easyUI Html          <div  region="center" border="false&qu ...

  8. 利用whoosh对mongoDB的中文文档建立全文检索

    1.建立索引 #coding=utf-8 from __future__ import unicode_literals __author__ = 'zh' import sys,os from wh ...

  9. Web Deploy配置及其使用VS进行Web部署

    前言: 因为公司一直比较保守所以一直都使用的是window 2008 R2版本的服务器,所以今天要讲的是在Window 2008 R2下如何配置Web Deploy. Web Deploy介绍: We ...

  10. GO-time&period;after 用法

    初学GO,time包里sleep是最常用,今天突然看到一个time.after,特记录time.after用法笔记如下: 首先是time包里的定义 // After waits for the dur ...