public override object Clone() { ComBrowserSettings cloned = new ComBrowserSettings(); cloned.CloneFrom(this); return(cloned); }
private static void AppendTypeAttribute(DescriptionBuilder sb, TYPEATTR typeAttr, TYPEFLAGS attribute) { if ((typeAttr.wTypeFlags & attribute) == attribute) { sb.Append(", "); sb.Append(ComBrowserSettings.GetKeyword(attribute)); } }
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)); } }
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("] "); } }
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() + "'>"); } }
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); } }
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); } }