Beispiel #1
0
        public override object Clone()
        {
            ComBrowserSettings cloned = new ComBrowserSettings();

            cloned.CloneFrom(this);
            return(cloned);
        }
Beispiel #2
0
 private static void AppendTypeAttribute(DescriptionBuilder sb, TYPEATTR typeAttr, TYPEFLAGS attribute)
 {
     if ((typeAttr.wTypeFlags & attribute) == attribute)
     {
         sb.Append(", ");
         sb.Append(ComBrowserSettings.GetKeyword(attribute));
     }
 }
Beispiel #3
0
        protected string GetComType(ITypeInfo typeInfo, TYPEDESC typeDesc)
        {
            VarEnum varEnum = (VarEnum)typeDesc.vt;

            switch (varEnum)
            {
            case VarEnum.VT_PTR:
                TYPEDESC ptrTypedesc = (TYPEDESC)Marshal.PtrToStructure(typeDesc.lpValue, typeof(TYPEDESC));
                return(GetComType(typeInfo, ptrTypedesc) + "*");

            case VarEnum.VT_SAFEARRAY:
                TYPEDESC arrayTypedesc = (TYPEDESC)Marshal.PtrToStructure(typeDesc.lpValue, typeof(TYPEDESC));
                return(ComBrowserSettings.GetKeyword(VarEnum.VT_SAFEARRAY) + "("
                       + GetComType(typeInfo, arrayTypedesc) + ")");

            case VarEnum.VT_CARRAY:
                TYPEDESC carrayTypedesc = (TYPEDESC)Marshal.PtrToStructure(typeDesc.lpValue, typeof(TYPEDESC));
                return(GetComType(typeInfo, carrayTypedesc) + "[]");

            case VarEnum.VT_USERDEFINED:
                // The .NET definition of GetRefTypeInfo() incorrectly takes an int instead of IntPtr, which fails
                // on 64-bit machines. At least don't throw an unhandled exception here.
                if ((long)typeDesc.lpValue > int.MaxValue)
                {
                    return("<GetRefTypeInfo bug>");
                }

                int       hreftype = (int)typeDesc.lpValue;
                ITypeInfo refTypeInfo;

                try
                {
                    typeInfo.GetRefTypeInfo(hreftype, out refTypeInfo);
                }
                catch (COMException)
                {
                    return("<GetRefTypeInfo failed>");
                }

                try
                {
                    return(Marshal.GetTypeInfoName(refTypeInfo));
                }
                finally
                {
                    Marshal.ReleaseComObject(refTypeInfo);
                }

            default:
                return(GetComType(varEnum));
            }
        }
Beispiel #4
0
        internal static void WriteParameterAttributes(DescriptionBuilder sb, ParameterDesc parameter)
        {
            bool first = true;

            if (parameter.IsIn)
            {
                if (first)
                {
                    first = false;
                    sb.Append("[");
                }
                else
                {
                    sb.Append(", ");
                }

                sb.Append(ComBrowserSettings.GetKeyword(ParameterAttributes.In));
            }
            if (parameter.IsOut)
            {
                if (first)
                {
                    first = false;
                    sb.Append("[");
                }
                else
                {
                    sb.Append(", ");
                }

                sb.Append(ComBrowserSettings.GetKeyword(ParameterAttributes.Out));
            }
            if (parameter.IsRetval)
            {
                if (first)
                {
                    first = false;
                    sb.Append("[");
                }
                else
                {
                    sb.Append(", ");
                }

                sb.Append(ComBrowserSettings.GetKeyword(ParameterAttributes.Retval));
            }

            if (!first)
            {
                sb.Append("] ");
            }
        }
Beispiel #5
0
        protected string GetComType(VarEnum varEnum)
        {
            if ((varEnum & VarEnum.VT_BYREF) == VarEnum.VT_BYREF)
            {
                return(GetComType(varEnum & ~VarEnum.VT_BYREF) + "&");
            }
            else if ((varEnum & VarEnum.VT_ARRAY) == VarEnum.VT_ARRAY)
            {
                return(ComBrowserSettings.GetKeyword(VarEnum.VT_ARRAY) + "("
                       + GetComType(varEnum & ~VarEnum.VT_ARRAY) + ")");
            }
            else if ((varEnum & VarEnum.VT_VECTOR) == VarEnum.VT_VECTOR)
            {
                return(GetComType(varEnum & ~VarEnum.VT_VECTOR) + "[]");
            }

            switch (varEnum)
            {
            case VarEnum.VT_BOOL:
            case VarEnum.VT_UI1:
            case VarEnum.VT_UI2:
            case VarEnum.VT_UINT:
            case VarEnum.VT_UI4:
            case VarEnum.VT_UI8:
            case VarEnum.VT_I1:
            case VarEnum.VT_I2:
            case VarEnum.VT_I4:
            case VarEnum.VT_INT:
            case VarEnum.VT_I8:
            case VarEnum.VT_R4:
            case VarEnum.VT_R8:
            case VarEnum.VT_BSTR:
            case VarEnum.VT_VOID:
            case VarEnum.VT_HRESULT:
            case VarEnum.VT_UNKNOWN:
            case VarEnum.VT_DISPATCH:
            case VarEnum.VT_CLSID:
            case VarEnum.VT_CY:
            case VarEnum.VT_DATE:
            case VarEnum.VT_DECIMAL:
            case VarEnum.VT_FILETIME:
            case VarEnum.VT_VARIANT:
            case VarEnum.VT_ERROR:
            case VarEnum.VT_LPSTR:
            case VarEnum.VT_LPWSTR:
                return(ComBrowserSettings.GetKeyword(varEnum));

            case VarEnum.VT_EMPTY:
            case VarEnum.VT_NULL:
            case VarEnum.VT_USERDEFINED:
            case VarEnum.VT_CARRAY:
            case VarEnum.VT_CF:
            case VarEnum.VT_RECORD:
            case VarEnum.VT_BLOB:
            case VarEnum.VT_BLOB_OBJECT:
            case VarEnum.VT_PTR:
            case VarEnum.VT_SAFEARRAY:
                Debug.Fail("GetComType(VarEnum) called for " + varEnum.ToString());
                return(varEnum.ToString());

            default:
                Debug.Fail("Unexpected value of varEnum: " + varEnum.ToString());
                return("<VarEnum type '" + varEnum.ToString() + "'>");
            }
        }
Beispiel #6
0
        private DescriptionText GetDescription()
        {
            try
            {
                DescriptionBuilder sb = new DescriptionBuilder(true);

                IntPtr ptr = IntPtr.Zero;
                m_typeInfo.ComType.GetTypeAttr(out ptr);

                try
                {
                    TYPEATTR typeAttr = (TYPEATTR)Marshal.PtrToStructure(ptr, typeof(TYPEATTR));

                    // Type GUID and attributes.

                    sb.Append("[ uuid(");
                    sb.Append(typeAttr.guid.ToString().ToUpper());
                    sb.Append(")");

                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FAGGREGATABLE);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FAPPOBJECT);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FCONTROL);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FLICENSED);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FHIDDEN);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FNONEXTENSIBLE);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FOLEAUTOMATION);
                    AppendTypeAttribute(sb, typeAttr, TYPEFLAGS.TYPEFLAG_FRESTRICTED);

                    sb.Append(" ]");
                    sb.EndLine();

                    // Object type (including interface type for an interface).

                    ObjectType objectType = GetObjectType(typeAttr);

                    if (objectType == ObjectType.Interface)
                    {
                        sb.Append(ComBrowserSettings.GetKeyword(GetInterfaceType(typeAttr)));
                    }
                    else
                    {
                        sb.Append(ComBrowserSettings.GetKeyword(objectType));
                    }
                    sb.Append(" ");
                }
                finally
                {
                    m_typeInfo.ComType.ReleaseTypeAttr(ptr);
                }

                // Name and description.

                sb.AppendName(Marshal.GetTypeInfoName(m_typeInfo.ComType));
                sb.EndFirstLine();

                sb.Append(@"     Member of ");
                sb.AppendLink(Namespace.NodeText, Namespace);
                sb.EndLine();

                string description = GetDocString();
                if (description != null && description.Length != 0)
                {
                    sb.AppendHeading("Description:");
                    sb.Append(description);
                }

                return(sb.GetText());
            }
            catch (System.Exception ex)
            {
                throw new ApplicationException("Failed to write the type declaration for type '"
                                               + Marshal.GetTypeInfoName(m_typeInfo.ComType) + "'.", ex);
            }
        }
Beispiel #7
0
        public ComInterfaceType GetInterfaceType()
        {
            Debug.Assert(m_typeInfo != null, "m_typeInfo != null");

            IntPtr ptr = IntPtr.Zero;

            m_typeInfo.ComType.GetTypeAttr(out ptr);

            try
            {
                TYPEATTR typeAttr = (TYPEATTR)Marshal.PtrToStructure(ptr, typeof(TYPEATTR));

                ObjectType type = GetObjectType(typeAttr);
                if (type != ObjectType.Interface)
                {
                    throw new ApplicationException("Unable to get the interface type for type '"
                                                   + DisplayName + "', because its object type is '" + ComBrowserSettings.GetKeyword(type)
                                                   + "', not 'interface'.");
                }

                return(GetInterfaceType(typeAttr));
            }
            finally
            {
                m_typeInfo.ComType.ReleaseTypeAttr(ptr);
            }
        }