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