2012-12-06 63 views
0

我已经开发了用于Microsoft Excel 2007和2010的加载项与Visual Studio 2010RPC_E_WRONG_THREAD错误和粘贴从Excel到Word

它正常工作的所有计算机(在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文档中。错误发生在多次循环后,当Excel范围通过方法Range.CopyPicture复制到剪贴板,然后在尝试访问我的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中

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

感谢

回答

0

你实际上并没有一个Word.Document对象,Word.Document只是一个接口。 Word._Document是Word.Document接口的实现(因此您将在调试中看到的类型以及例外情况)。

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

A RPC_E_WRONG_THREAD error occurs when a thread calls via an interface pointer which is for a proxy object that does not belong to the thread's apartment.

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

我真的不能告诉你比任何都没有发现一个代码示例,但我希望这可以帮助你找到问题。

编辑:

其实,看着你发布的链接,我建议你前凑所有要复制/数据粘贴到Word文档中出与擅长任何COM对象的你把它放入Word中。我知道这将意味着额外的工作才能实现正确的格式化/表格,但Office COM存在很多问题(例如数据绑定),并且从长远角度来看,它可能会更稳定/更轻松。

0

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

但是,如果您不创建线程,COM将防止您在错误的公寓内使用对象。例如,如果您的代码创建了一个新的Word文档,则您可以通过自动创建的代理对象访问此对象(位于不同的进程中)。如果您通过Word文档代理访问其他对象,它将创建其他代理对象。所有这一切发生,你甚至没有注意到它。出于蓝色,我会说你不可能做错了什么。

我试图找到一个最小的例子,显示这种行为,并在这里发布。没有一些额外的信息就很难说出错的地方。但我必须警告你,你可能无法解决你的问题。我用Excel和自动化做了一些非常严肃的事情,并且我在Excel中发现了一些非常严重的错误,它们需要非常骇人的解决方法。事实上,这些错误自2005年以来一直未得到解决,这让我相信微软对Office自动化没有多大兴趣。看起来好像你发现了更多的错误。

问候, 斯图尔特



PS:我不想发送此作为一个答案,但显然我必须为了能够提出意见,以赚取更多的声誉点。 Whyever。