错误处理(一)—— 被呼叫方拒绝接收呼叫。 (异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED))
——————————————————————————
亲测方案2可用
——————————————————————————
转载自:http://blog.csdn.net/hyman_c/article/details/53780431
最近在进行Word相关的开发时遇到了这个错误,在网上找了很多资料,发现就那么几个解决方案(方案3和方案4),但是都没有很好的解决这个问题。后面在stackoverflow看到一个歪果仁提供的一个思路(方案1),完美解决了这个问题。而后无意中浏览到了MSDN,发现原来微软早就提供了这个问题的解决方案(方案2),可以从根本上避免此类异常的发生,可恶的微软隐藏的这么深。下面特意把这些方案整理出来。
方案1 捕捉异常,利用委托(delegate)和泛型重复执行异常的方法。
这个方案可以很完美的解决该问题,主要的思路就是捕获异常。如果获取的异常为该异常重复调用发生异常的方法,知道能够顺利调用完成为止。这个方案定义了两类泛型函数,函数的参数是委托。我们调用时就是把我们可能抛出异常的方法放到委托中通过下面类似的泛型函数进行调用。
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;} } }
Github位置:
https://github.com/HymanLiuTS/OfficeTestByC-
克隆本项目:
git clone git@github.com:HymanLiuTS/OfficeTestByC-.git
获取本文源代码:
git checkout L16
错误处理(一)—— 被呼叫方拒绝接收呼叫。 (异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED))相关推荐
- 解决Com调用AutoCAD被呼叫方拒绝接收呼叫
在用Com调用AutoCAD的代码试,一般第一次启动时会出现"被呼叫方拒绝接收呼叫,异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED)"的错 ...
- 提问:Unable to evaluate the expression. 被呼叫方拒绝接收呼叫。
页面结构如下: index.html,里有两个框架页面 <body style="width:100%;height: 100%;border:0;margin:0px; paddin ...
- 被呼叫方拒绝接收呼叫_奇瑞和星途汽车2020年呼叫中心外包采购项目
采购类别:广宣类 1.项目名称:奇瑞和星途汽车2020年呼叫中心外包采购项目(寻源预告) 2.项目概况与采购范围 2.1项目概况 为提升客户满意度,实时受理客户需求,开展24小时*365天呼叫中心服务 ...
- Excel导出 被呼叫方拒绝接收呼叫。异常来自HRESULT:0x80010001(RPC_E_CALL_REJECTED)
c#使用OLE方式调用Excel导出时,会出现如标题的错误. 已发现的可能原因是:在导出的Excel中,有使用宏或自动根据数据源刷新的图表数据,在填充数据源后,宏或图表刷新时,触发了文件更改操作,导致 ...
- python 报错 被呼叫方拒绝接收呼叫_在对excel的操作中报错,被呼叫方拒绝接收呼叫...
- 王大海 2009-03-12 06:25 (二) 使用Delphi 控件方法 在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksh ...
- 被呼叫方拒绝接收呼叫 或者 消息筛选器显示应用程序正在使用中。
解决方案: 在运行里面输入: dcomcnfg 在"服务"里找到这三个服务,都去启动 Distributed Transaction Coordinator Remote Proc ...
- 被呼叫方拒绝接收呼叫。 (异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED))
原因可能为: 1.目录权限 2.操作频繁 若是权限问题,按如下步骤: 在运行里面输入: dcomcnfg 在"服务"里找到这三个服务,都去启动 Distributed Tran ...
- wordpress拒绝访问_拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))
iis提示“另一个程序正在使用此文件,进程无法访问.(异常来自HRESULT:0x80070020) 看看IIS的网站,惊人的发现default web site是停止状态.印象中没有停止它啊.右键- ...
- 未能加载文件或程序集“AspNetPager”或它的某一个依赖项。拒绝访问。(异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))...
问题: 新装完win10系统,用vs调试程序出现错误 生成网站成功,在iis部署上访问正常. 解决办法: 给C:\Windows\Microsoft.NET\Framework\v2.0.50727\ ...
最新文章
- NOj 720项目安排
- gradle工作流程
- Schedulerx2.0分布式计算原理最佳实践
- mysql8安装步骤及排坑
- 截取视频段转换为GIF动图
- MySQL学习(一)—初识MySQL
- javaweb实训第四天下午——员工管理系统-JSPServletJDBC综合练习-CRUD
- E: Could not get lock /var/lib/dpkg/lock(无法获得锁)
- java 小总结,以后复习看以看
- css的优先级及复合选择器权重计算
- 嵌入式状态机编程-QP状态机框架与常见状态机方法
- 【分享】RSS订阅技巧及工具和实用RSS链接分享
- Listener-session的钝化与活化
- Mac Mysql5.7.6+免安装版教程
- poj-1979改-红与黑
- ie8 css hack 只适用ie8的css写法
- html如何设置顶部,css中文字如何设置在顶部
- python爬取虎扑评论_Python爬取NBA虎扑球员数据
- 修改 ubnt 路由器固件
- 2018年的学习任务