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

简介: 本来form method=post本页面 修改为其他页面 action=save.aspx后没问题 其他问题可参考以下: 引自:http://topic.csdn.net/u/20090108/17/f240cd4d-72cf-44bc-851e-cc587dd7e468.html源问题:详细内容: System.Runtinm.InteropServices.COMException 被调用的对象已与其客户端断开连接。

本来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#
目录
相关文章
|
7月前
|
网络协议 程序员 Python
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。
|
Python
Python多线程下调用win32com包相关问题:pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。‘, None, None)问题处理
Python多线程下调用win32com包相关问题:pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。‘, None, None)问题处理
1149 0
|
Go
Go channel被关闭时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题
Go channel被关闭时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题
184 0
|
缓存 NoSQL Java
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
Qt窗口关闭和应用程序停止是否调用析构函数的一些说明
Qt窗口关闭和应用程序停止是否调用析构函数的一些说明
Qt窗口关闭和应用程序停止是否调用析构函数的一些说明
|
Python
Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
584 0
Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
|
存储 Java 程序员
在线程异步的场合下,如何将线程信息传递到调用处(1)
在线程异步的场合下,如何将线程信息传递到调用处
131 0
在线程异步的场合下,如何将线程信息传递到调用处(2)
在线程异步的场合下,如何将线程信息传递到调用处
154 0
|
数据库
SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败
原文:SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败 今天发现队列读取器代理不停地尝试启动但总是出错: 其中内容如下: 队列读取器代理在连接“PublicationServer”上的“pubDB”时遇到错误“试图进行的插入或更新已失败, 原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION, 而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
1449 0

热门文章

最新文章