C#COM Office Automation – RPC_E_SYS_CALL_FAILED

我正在编写一个充当PowerPoint 2007插件的C#程序。 在某些计算机上,某些对PowerPoint对象模型的调用会抛出一个带有消息RPC_E_SYS_CALL_FAILEDCOMException 。 关于如何处理此错误或如何避免错误,我找不到任何具体建议。 从谷歌搜索它看起来与消息队列或单线程公寓有关。 还是我离开了?

错误消息的示例是:

系统调用失败。 (来自HRESULT的exception:0x80010100(RPC_E_SYS_CALL_FAILED))
在Microsoft.Office.Interop.PowerPoint._Presentation.get_FullName()

不幸的是,问题出现在客户端的机器上,所以我没有简单的方法来调试它! 我是否应该在收到此错误时重试呼叫?

任何建议,以帮助我解决这个问题将不胜感激!

我不知道它与您的问题有关,但您的所有COM调用必须来自创建加载项的同一个线程。 如果您创建了新线程,则必须特别小心。 这两篇文章描述了详细信息:

  • 在Office加载项和中实现IMessageFilter
  • 为什么您的COMAddIn.Object应该从StandardOleMarshalObject派生

你是从一个设置了ApartmentState的线程进行调用吗? 如果没有,那可能是罪魁祸首 – COM互操作对于那种事情非常挑剔

客户端的安全设置是什么? 客户端的安全设置(Windows / OS设置或PowerPoint / App设置)很可能不允许您的插件通过RPC进行通信。

如果从后台线程调用Powerpoint对象模型,则很容易发生这种情况。 一个看似合理的方案是使用定时器来定期检查某种状态值。 如果,当计时器触发时,Powerpoint正忙(例如对话框打开),则呼叫将失败。

这篇Microsoft文章概述了Office中的线程支持: http : //msdn.microsoft.com/en-us/library/8sesy69e.aspx