访问嵌套连接器形状的BeginConnectedShape和EndConnectedShape时出现COMException(灾难性故障)

时间:2014-09-29 13:28:31

标签: c# powerpoint office-interop office-addins

我正在创建一个PowerPoint AddIn,它应该从外部文件读取信息并将该信息集成到当前幻灯片中,其中包含形状,主要是文本框形状和连接文本框的连接器形状。每个连接器都位于一个组内,包含连接器形状和文本框,并充当连接器的标签。下图描绘了这种情况。

enter image description here

我的任务涉及访问组中包含的连接器形状的属性,如上所述,即BeginConnectedShape和EndConnectedShape。这里有一些代码可以做到这一点:

Shape groupShape = Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange[1];
//check if groupshape actually is a group
if (groupShape.Type == Microsoft.Office.Core.MsoShapeType.msoGroup) {
    //iterate over all elements within groupShape
    foreach (Shape childShape in groupShape.GroupItems)
    {
        if (childShape.Connector == Microsoft.Office.Core.MsoTriState.msoTrue)
        {
            //if the shape is a connector, retrieve source and target of the connector
            Shape source = childShape.ConnectorFormat.BeginConnectedShape;
            Shape target = childShape.ConnectorFormat.EndConnectedShape;

            //Do something with source and target.
        }
    }
}

在包含正确连接的连接器形状的组(即,两端连接到其他形状的锚点)的组中运行此代码会产生以下异常。

System.Runtime.InteropServices.COMException wurde nicht von Benutzercode behandelt.
  HResult=-2147418113
  Message=Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
  Source=HandoverAddin
  ErrorCode=-2147418113
  StackTrace:
       at Microsoft.Office.Interop.PowerPoint.ConnectorFormat.get_BeginConnectedShape()
       at MyAddin.Ribbon.button1_Click(Object sender, RibbonControlEventArgs e) in Ribbon.cs:line 56
       at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl control)
       at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ButtonClickCallback(RibbonComponentImpl component, Object[] args)
       at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.Invoke(RibbonComponentCallback callback, Object[] args)
       at Microsoft.Office.Tools.Ribbon.RibbonMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.System.Reflection.IReflect.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
  InnerException:

执行childShape.ConnectorFormat.BeginConnectedShape时会引发此异常。 childShape.ConnectorFormat.EndConnectedShape也提出了这个例外。 ConnectorFormat内的其他操作正常工作(即BeginDisconnect成功断开连接器的启动。)

如果连接器未包含在组中,则

shape.ConnectorFormat.BeginConnectedShape可以正常工作。在我的情况下,连接器和相关标签必须组合在一起。

我还观察到,无论该连接器是否包含在组内,访问具有断开连接的连接器的BeginConnectedShape都会引发UnauthorizedAccessException。这似乎是预期的行为。

上面列出的异常似乎是某种内部异常,在正常情况下不应该被引发。因此,我检查了任何可用的更新,但没有找到Office 2010和Visual Studio 2010 Professional。

非常感谢您对此问题的任何帮助,可能的修复或解决方法。


编辑:使用VBA实现相同的功能也会导致代码为8000FFFF的错误(与上面相同)。

1 个答案:

答案 0 :(得分:0)

这是一个粗略的VBA版本可能会有所帮助:

我认为它与你的基本相同,除了增加的测试:

如果osh.Connector

没有它,它会引发错误,因为它正在查看组中的每个形状,但只有连接器具有.ConnectorFormat及其相关属性。

Dim groupshape As Shape
Dim oSh As Shape
Dim oBgnShape As Shape
Dim oEndShape As Shape

Set groupshape = ActiveWindow.Selection.ShapeRange(1)

If groupshape.Type = msoGroup Then
For Each oSh In groupshape.GroupItems
    **If oSh.Connector Then**
        Set oBgnShape = oSh.ConnectorFormat.BeginConnectedShape
        Debug.Print oBgnShape.Left
        Set oEndShape = oSh.ConnectorFormat.EndConnectedShape
    End If
Next

End If