C#COM Office自动化-RPC_E_SYS_CALL_FAILED
时间:2020-03-06 14:24:32 来源:igfitidea点击:
我正在编写一个用作PowerPoint 2007插件的C程序。在某些计算机上,对PowerPoint对象模型的某些调用会抛出" COMException"和消息" RPC_E_SYS_CALL_FAILED"。对于如何处理此错误或者如何避免此错误,我找不到任何具体建议。从Googling看来,它与消息队列或者单线程公寓有关。还是我要离开?
错误消息的示例是:
System call failed. (Exception from HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED)) at Microsoft.Office.Interop.PowerPoint._Presentation.get_FullName()
不幸的是,问题发生在客户端计算机上,因此我没有简单的方法来调试它!每当出现此错误时,我是否应该重试呼叫?
任何帮助我解决此问题的建议将不胜感激!
解决方案
我们是从设置了ApartmentState的线程进行呼叫的吗?如果不是,那可能是罪魁祸首COM互操作对这种事情很挑剔
客户端的安全设置是什么?客户端的安全设置(Windows / OS设置或者PowerPoint / App设置)很可能不允许插件通过RPC进行通信。
我不知道这与问题有关,但是我们所有的COM调用都必须来自创建外接程序的同一线程内。如果创建了新线程,则必须格外小心。这两篇文章描述了详细信息:
- 在Office加载项中实现IMessageFilter和
- 为什么COMAddIn.Object应该从StandardOleMarshalObject派生
如果我们从后台线程对Powerpoint对象模型进行任何调用,则很容易发生这种情况。一种可能的情况是使用一个计时器来定期检查某种状态值。如果在计时器触发时Powerpoint忙(例如,打开了一个对话框),则呼叫将失败。
Microsoft的这篇文章概述了Office中的线程支持:
http://msdn.microsoft.com/zh-CN/library/8sesy69e.aspx