访问COM组件时出错
我为Microsoft Office Word构build了一个加载项。 当Word以pipe理员身份运行时,使用外接程序时没有问题,但是如果没有以pipe理员身份运行Word,则存在两个访问function区元素的常见exception。
第一个例外:
Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Core.IRibbonUI'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000C03A7-0000-0000-C000-000000000046}' failed due to the following error: could not be found. (Exception from HRESULT: 0x80030002 (STG_E_FILENOTFOUND)). at Microsoft.Office.Core.IRibbonUI.InvalidateControl(String ControlID)
当控制被以下代码无效时,会发生此错误:
ribbon.InvalidateControl("control-id");
而第二个例外:
Unable to cast COM object of type 'Microsoft.Office.Interop.Word.ApplicationClass' to interface type 'Microsoft.Office.Interop.Word._Application'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00020970-0000-0000-C000-000000000046}' failed due to the following error: could not be found. (Exception from HRESULT: 0x80030002 (STG_E_FILENOTFOUND)). at Microsoft.Office.Interop.Word.ApplicationClass.get_Selection()
以下代码的最后一行发生此错误:
object wdStory = Word.WdUnits.wdStory; object wdMove = Word.WdMovementType.wdMove; WrdApp.Selection.EndKey(ref wdStory, ref wdMove)
我该如何解决这个问题?
问题解决了!
我以前安装过Office 2010,因此Windowsregistry中存在一些不一致的情况。 要解决这些问题,请打开regedit
并从错误中查找CLSID。
你会发现这样的第二个错误:
HKEY_CLASSES_ROOT\Interface\{00020970-0000-0000-C000-000000000046}
使用子键:
- ProxyStubClsid
- ProxyStubClsid32
- types库
查看TypeLib
中的(Default)
和Version
值。
现在find下面的节点,使用(Default)
值作为<TypeLib ID>
。
HKEY_CLASSES_ROOT \ TypeLib \ <TypeLib ID>
\
作为这个元素的子元素,你会发现不止一个元素,其中一个是第一个registry的Version
。 如果你检查其他元素,你会发现他们没有指向任何东西。 删除其他人!!! 它解决了!
升级到最新的Office版本后,我开始得到相同的exception。 我尝试了一些build议的修复,包括清理registry的方式类似于@Victor所描述的。
最终的帮助(尽pipe可能是多种因素的结合)是“修复”安装:
程序和function →最新的Office版本→ 修复 。
只需安装Office 2010 / MS word / .NET可编程性支持。
@Victor你让我走在正确的道路上。 我的问题不是registry中的多个值,而是Office365从未添加的缺失值。 感谢你,我能find自己的决议。 千万分谢谢。
任何人仍然在寻找决议的细节。
我今天VS2015和Office 2013遇到同样的问题。将平台目标更改为x64为我工作。