首页 文章

剪切并从Excel粘贴到Word时出现RPC_E_WRONG_THREAD错误

提问于
浏览
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文档中 . 几个循环后发生错误,当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一起使用 .

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

谢谢

2 回答

  • 0

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

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

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

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

    如果没有代码示例,我真的不能告诉你,但我希望这可以帮助你找到问题所在 .

    编辑:

    实际上,看看你发布的链接,我建议你把你要复制/粘贴到Word文档中的所有数据从excel before 中放入Word中 . 我知道这将意味着额外的工作来实现正确的格式化/表格,但是有很多东西被Office COM破坏(例如数据绑定),从长远来看它可能更稳定/更少麻烦 .

  • 0

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

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

    我试图找到一个显示此行为的最小示例并将其发布到此处 . 没有一些额外的信息,很难说你可能出错了 . 但我必须警告你,你可能无法解决你的问题 . 我用Excel和自动化做了一些相当严肃的事情,我在Excel中发现了一些非常严重的错误,需要非常糟糕的解决方法 . 自2005年以来这些漏洞尚未修复的事实使我相信微软对Office Automation并不感兴趣 . 好像你已经发现了另外一个bug .

    此致,斯图尔特

    PS:我不想发送这个作为答案,但显然我必须获得更多的声望点才能发表评论 . Whyever .

相关问题