0

我使用 Visual Studio 2010 为 Microsoft Excel 2007 和 2010 开发了一个插件。

它在安装了它的所有计算机(在 Windows XP 和 Windows 7 上)上都能正常工作,除了一台装有 Windows 7 和 Office 2010 的机器。

当加载项尝试自动化 Microsoft Word 2010 以创建新文档并将 Excel 工作簿中的信息复制/粘贴到其中时,将显示以下消息:

*无法将类型为“Microsoft.Office.Interop.Word.DocumentClass”的 COM 对象转换为接口类型“Microsoft.Office.Interop.Word._Document”。此操作失败,因为 IID 为“{0002096B-00000-0000-C000-0000000000046}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:应用程序调用了为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))。*

我的程序循环遍历 Excel 工作簿的工作表并将它们复制到 Word 文档中。该错误发生在几个循环之后,当使用 Range.CopyPicture 方法将 Excel 范围复制到剪贴板时,当我尝试访问我的 Word 应用程序时会引发 RPC_E_WRONG_THREAD 错误。我不使用多个线程。

有人似乎有同样的问题,但尚未提供答案: http: //social.msdn.microsoft.com/Forums/en/vsto/thread/86abd253-9fb5-46cf-8565-dc2eaa02593b

用户具有管理权限,他尝试修复 MS Office 2010 安装,并再次卸载/安装它,但没有解决问题。在他的计算机上安装 Office 2007 后,该加载项在 Excel 2007 中运行良好,但在 Excel 2010 中仍然无法正常运行。

你有没有见过这个错误,你知道如何解决它吗?

谢谢

4

2 回答 2

0

您实际上没有 Word.Document 对象,Word.Document 只是一个接口。Word._Document 是 Word.Document 接口的实现(因此是您将在调试和异常中看到的类型)。

知道 Word.Document 只是一个接口:

当线程通过接口指针调用不属于线程单元的代理对象时,会发生 RPC_E_WRONG_THREAD 错误。

http://support.microsoft.com/kb/172314

如果没有代码示例,我真的无法告诉您更多信息,但我希望这可以帮助您找到问题所在。

编辑:

实际上,查看您发布的链接,我建议您在将其放入 Word之前,从与 Excel 相关的任何 COM 对象中刮取所有要复制/粘贴到 Word 文档中的数据。我知道这意味着需要额外的工作来实现正确的格式/表格,但是 Office COM 有很多问题(例如数据绑定),从长远来看它可能更稳定/更少麻烦。

于 2012-12-07T14:15:20.897 回答
0

据我所知,Word 应用程序和 Excel 应用程序不能在同一个进程中运行。因此,如果您同时使用 Excel 工作表和 Word 文档,则必须使用来自两个进程的对象,因此必须使用两个不同的线程(每个进程都有自己的一组线程)。

但是,如果您不创建线程,COM 将保护您不使用错误单元内的对象。例如,如果您的代码创建了一个新的 Word 文档,那么您对这个对象(位于不同的进程中)的访问将通过一个自动创建的代理对象来完成。如果您通过 Word 文档代理访问其他对象,则会创建其他代理对象。这一切都发生在你甚至没有注意到它的情况下。出乎意料的是,我会说你不可能做错了什么。

我会尝试找到一个显示此行为的最小示例并将其发布在此处。如果没有一些额外的信息,很难说你可能在哪里出错了。但我必须警告你,你可能无法为你的问题找到解决方案。我用 Excel 和自动化做了一些非常严肃的事情,我在 Excel 中发现了一些非常严重的错误,需要非常黑客的解决方法。这些错误自 2005 年以来一直没有得到修复,这一事实让我相信微软对办公自动化并不感兴趣。似乎您又发现了一个错误。

问候,斯图尔特



PS:我不想将其作为答案发送,但显然我必须获得更多声望点才能发表评论。随便。

于 2012-12-09T00:40:42.840 回答