zoukankan      html  css  js  c++  java
  • 正确释放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 
    被调用的对象已与其客户端断开连接。 (异常来自 HRESULT:0x80010108 (RPC_E_DISCONNECTED)) 
    ErrorCode:-2147417848 
    Souce:Interop.Word 
    StackTrace:" 在 Word.ApplicationClass.Quit(Object& SaveChanges, Object& OriginalFormat, Object& RouteDocument) 在 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: 
  • 相关阅读:
    9.9递归和动态规划(七)——实现很多图片编辑软件都支持的“填充颜色”功能
    使用azure send grid发送email
    (C++ STL)list的实现
    安卓源代码----安卓系统启动过程(初次研究源代码,表述不当还请见谅)
    Mqtt协议IOS端移植3
    [Servlet&JSP] 标准标签
    table合并单元格
    解决chrome浏览器对于自动填充的input表单添加的默认的淡黄色背景问题 && 一般的浏览器input和button的高度不一致问题
    如何使一个div能够铺满整个页面? && 模态框的制作 && outerHTML
    原生js实现轮播图
  • 原文地址:https://www.cnblogs.com/y0umer/p/3838930.html
Copyright © 2011-2022 走看看