——————————————————————————

亲测方案2可用

——————————————————————————

转载自:http://blog.csdn.net/hyman_c/article/details/53780431

最近在进行Word相关的开发时遇到了这个错误,在网上找了很多资料,发现就那么几个解决方案(方案3和方案4),但是都没有很好的解决这个问题。后面在stackoverflow看到一个歪果仁提供的一个思路(方案1),完美解决了这个问题。而后无意中浏览到了MSDN,发现原来微软早就提供了这个问题的解决方案(方案2),可以从根本上避免此类异常的发生,可恶的微软隐藏的这么深。下面特意把这些方案整理出来。

方案1 捕捉异常,利用委托(delegate)和泛型重复执行异常的方法。

这个方案可以很完美的解决该问题,主要的思路就是捕获异常。如果获取的异常为该异常重复调用发生异常的方法,知道能够顺利调用完成为止。这个方案定义了两类泛型函数,函数的参数是委托。我们调用时就是把我们可能抛出异常的方法放到委托中通过下面类似的泛型函数进行调用。

利用委托Action进行泛型的定义:
public static void RunWithOutRejected<T>(Action<T> action, T t)  {  bool hasException;  do  {  try  {  action(t);  hasException = false;  }  catch (System.Runtime.InteropServices.COMException e)  {  if (e.ErrorCode == -2147418111)  {  hasException = true;  }  else  {  throw;  }  }  catch (Exception)  {  throw;  }  } while (hasException);  }  

利用委托Func进行泛型的定义:

public static T RunWithOutRejected<T>(Func<T> func)  {  var result = default(T);  bool hasException;  do  {  try  {  result = func();  hasException = false;  }  catch (System.Runtime.InteropServices.COMException e)  {  if (e.ErrorCode == -2147418111)  {  hasException = true;  }  else  {  throw;  }  }  catch (Exception)  {  throw;  }  } while (hasException);  return result;  }  

使用泛型的一个例子:

public void ClearWordRange(Word.Range range)
{  Action<Word.Range> action = ExceptionHandlerInnerClearWordRange;  ExceptionHandler.RunWithOutRejected(action, range);
}
private void ExceptionHandlerInnerClearWordRange(Word.Range range)
{  range.Text = "";  range = null;
}  

方案2 引入IOleMessageFilter,从根本上杜绝这种异常情况的出现

MSDN地址: https://msdn.microsoft.com/zh-cn/library/ms228772(v=vs.120).aspx

按照微软的意思,这个异常产生的根本原因是我们自己写的程序和外部的WORD程序间线程征用所致,它定义了一个MessageFilter类继承自IOleMessageFilter来进行这些线程的管理。在它的示例代码中,还引入并打开了IDE,我想它只是为了演示MessageFilter的用法,真正能解决问题的只是在你程序的开始和结束位置分别进行MessageFilter.Register()和MessageFilter.Revoke()就可以了。

另外贴上自己使用的代码:

public void PrintWord(String dirPath, String fileName)
{try{MessageFilter.Register();object oTemplate = dirPath + @"\" + fileName;Microsoft.Office.Interop.Word._Document oDoc = oWord.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);object oTrue = true;oDoc.PrintOut(ref oTrue);object doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;oDoc.Close(ref doNotSaveChanges, ref oMissing, ref oMissing);MessageFilter.Revoke();=}catch (Exception e){FileHelper.ErrorLog(e.Message, "PrintWord", Data.UsersId);throw e;}
}

方案3 目录权限问题

若是权限问题,按如下步骤:

步骤1打开dcomcnfg

        在运行里面输入: 
msdtc -resetlog  

然后再开启:Distributed Transaction Coordinator 。接着关闭服务组件窗体 ,并重新打开,这个时候每个组建就有属性了。然后在命令行中输入:

dcomcnfg  

步骤2 进行DCOM 配置

打开“组件服务->计算机->我的电脑->DCOM 配置”,找到“Microsoft Word文档”,单击右键,选择“属性”。在“属性”对话框中单击“标识”选项卡,选择“交互式用户””,关闭“组件服务”管理器。

PS:这个方案没有仔细研究。不过操作Word和Excel应该用到的是COM接口,这里却要进行DCOM相关配置,有些让人费解。反正这个方案在我电脑上是无效的。

方案4 操作频繁问题,在代码中加入延时。

int m_iErrCnt=0;
while( true )
{  try  {  bm0.Range.Text=bandvalue;  break;  }  catch(SystemException err)  {  m_iErrCnt++;  if( m_iErrCnt<10 )  {  System.Threading.Thread.Sleep(1000);  }  else  { throw err;}  }  }  
PS:这个方案可以解决问题,但是不是很完美,因为中间Sleep的时间不好把控,而且Sleep会影响程序的效率。若是在界面主程序中Sleep还会造成界面的无响应状态。

Github位置:
https://github.com/HymanLiuTS/OfficeTestByC-
克隆本项目:
git clone git@github.com:HymanLiuTS/OfficeTestByC-.git
获取本文源代码:
git checkout L16

错误处理(一)—— 被呼叫方拒绝接收呼叫。 (异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED))相关推荐

  1. 解决Com调用AutoCAD被呼叫方拒绝接收呼叫

    在用Com调用AutoCAD的代码试,一般第一次启动时会出现"被呼叫方拒绝接收呼叫,异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED)"的错 ...

  2. 提问:Unable to evaluate the expression. 被呼叫方拒绝接收呼叫。

    页面结构如下: index.html,里有两个框架页面 <body style="width:100%;height: 100%;border:0;margin:0px; paddin ...

  3. 被呼叫方拒绝接收呼叫_奇瑞和星途汽车2020年呼叫中心外包采购项目

    采购类别:广宣类 1.项目名称:奇瑞和星途汽车2020年呼叫中心外包采购项目(寻源预告) 2.项目概况与采购范围 2.1项目概况 为提升客户满意度,实时受理客户需求,开展24小时*365天呼叫中心服务 ...

  4. Excel导出 被呼叫方拒绝接收呼叫。异常来自HRESULT:0x80010001(RPC_E_CALL_REJECTED)

    c#使用OLE方式调用Excel导出时,会出现如标题的错误. 已发现的可能原因是:在导出的Excel中,有使用宏或自动根据数据源刷新的图表数据,在填充数据源后,宏或图表刷新时,触发了文件更改操作,导致 ...

  5. python 报错 被呼叫方拒绝接收呼叫_在对excel的操作中报错,被呼叫方拒绝接收呼叫...

    - 王大海 2009-03-12 06:25 (二)   使用Delphi   控件方法 在Form中分别放入ExcelApplication,   ExcelWorkbook和ExcelWorksh ...

  6. 被呼叫方拒绝接收呼叫 或者 消息筛选器显示应用程序正在使用中。

    解决方案: 在运行里面输入: dcomcnfg 在"服务"里找到这三个服务,都去启动 Distributed Transaction Coordinator Remote Proc ...

  7. 被呼叫方拒绝接收呼叫。 (异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED))

    原因可能为: 1.目录权限  2.操作频繁 若是权限问题,按如下步骤: 在运行里面输入:  dcomcnfg 在"服务"里找到这三个服务,都去启动 Distributed Tran ...

  8. wordpress拒绝访问_拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))

    iis提示“另一个程序正在使用此文件,进程无法访问.(异常来自HRESULT:0x80070020) 看看IIS的网站,惊人的发现default web site是停止状态.印象中没有停止它啊.右键- ...

  9. 未能加载文件或程序集“AspNetPager”或它的某一个依赖项。拒绝访问。(异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))...

    问题: 新装完win10系统,用vs调试程序出现错误 生成网站成功,在iis部署上访问正常. 解决办法: 给C:\Windows\Microsoft.NET\Framework\v2.0.50727\ ...

最新文章

  1. 人工智能领导世界走向何方?
  2. bzoj 1084 DP
  3. java中字节码_Java字节码浅析(—)
  4. Spark的event事件监听器LiveListenerBus和特质SparkListenerBus以及特质ListenerBus
  5. 20180908 2018-2019-2 《密码与安全新技术专题》第3周作业
  6. Phaser开源2d引擎 html5游戏框架中文简介
  7. [html]window.open 使用示例
  8. 相关系数法程序设计 opencv C++ CSU
  9. linux限制进程使用的cpu使用率
  10. java毕业设计——基于java+JavaBean+jsp的网上零食销售系统设计与实现(毕业论文+程序源码)——网上零食销售系统
  11. 傅里叶分析公式推导(最简单的傅里叶级数和傅里叶变换)
  12. 用python开发的云监控平台_edwin报警和监控平台开源了(python源码)
  13. cogs 2235 烤鸡翅
  14. 【Web技术】1139- 手把手教你实现手绘风格图形
  15. 使用node爬取小说内容并保存到本地
  16. 【RT-Thread 开源作品秀】时光空间立方
  17. (有理数类 )创建一个名为Rational的类,进行分数运算。
  18. mysql netcdf_NetCDF官方读写终端ncdump和ncgen的用法
  19. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t
  20. c#-中国象棋:画棋盘

热门文章

  1. 《 2021春运人群画像分析报告 》
  2. 1.1什么是DHTML
  3. Inventory文件扩展
  4. android 后台运行清理,【Android】App在后台被清理后的终极应对手段——重启应用...
  5. IIO子系统(Linux驱动开发篇)
  6. 服务器新建虚拟机不识别u盘,虚拟机无法识别u盘如何解决_虚拟机中无法识别u盘的处理办法...
  7. 运筹学--线性目标规划
  8. wireless_ultimate技术所得
  9. IDR:通过迭代数据细化的自我监督图像去噪
  10. 采样定理与奈奎斯特极限