How can I reliably get the object of a contact context menu in an Outlook 2013 addin?

六月ゝ 毕业季﹏ 提交于 2019-12-02 03:46:33

The type of the Context object depends on the place where you clicked and the context menu type. To get the underlying type you need to do the following:

  1. Cast the object to the IDispatch interface.
  2. Get the ITypeInfo interface using the GetTypeInfo method of the IDispatch interface.
  3. Get the type name using GetDocumentation method of the ITypeInfo interface.

    public static string GetTypeName(object comObj)
    {
    
        if (comObj == null)
            return String.Empty;
    
        if (!Marshal.IsComObject(comObj))
            //The specified object is not a COM object
            return String.Empty;
    
        IDispatch dispatch = comObj as IDispatch;
        if (dispatch == null)
            //The specified COM object doesn't support getting type information
            return String.Empty;
    
        ComTypes.ITypeInfo typeInfo = null;
        try
        {
            try
            {
                // obtain the ITypeInfo interface from the object
                dispatch.GetTypeInfo(0, 0, out typeInfo);
            }
            catch (Exception ex)
            {
                //Cannot get the ITypeInfo interface for the specified COM object
                return String.Empty;
            }
    
            string typeName = "";
            string documentation, helpFile;
            int helpContext = -1;
    
            try
            {
                //retrieves the documentation string for the specified type description 
                typeInfo.GetDocumentation(-1, out typeName, out documentation,
                    out helpContext, out helpFile);
            }
            catch (Exception ex)
            {
                // Cannot extract ITypeInfo information
                return String.Empty;
            }
            return typeName;
        }
        catch (Exception ex)
        {
            // Unexpected error
            return String.Empty;
        }
        finally
        {
            if (typeInfo != null) Marshal.ReleaseComObject(typeInfo);
        }
    }
    

    }

See HowTo: get the actual type name behind System.__ComObject with Visual C# or VB.NET for more information.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!