/// <summary> /// Analyze the given element (i.e. composite type of an argument) recursively /// </summary> private void AnalyzeElement(ITypeInfo typeInfo, ELEMDESC elementDesc) { TYPEDESC typeDesc = elementDesc.tdesc; // If the current type is a pointer or an array, determine the child type and analyze that. while (((VarEnum)typeDesc.vt == VarEnum.VT_PTR) || ((VarEnum)typeDesc.vt == VarEnum.VT_SAFEARRAY)) { var childTypeDesc = (TYPEDESC)Marshal.PtrToStructure(typeDesc.lpValue, typeof(TYPEDESC)); typeDesc = childTypeDesc; } // We're only interested in user defined types for recursive analysis if ((VarEnum)typeDesc.vt == VarEnum.VT_USERDEFINED) { IntPtr hrefType = typeDesc.lpValue; IFixedTypeInfo childTypeInfo = null; try { IFixedTypeInfo fixedTypeInfo = (IFixedTypeInfo)typeInfo; fixedTypeInfo.GetRefTypeInfo(hrefType, out childTypeInfo); AnalyzeTypeInfo((ITypeInfo)childTypeInfo); } finally { if (childTypeInfo != null) { _marshalReleaseComObject(childTypeInfo); } } } }
private void AnalyzeElement(ITypeInfo typeInfo, System.Runtime.InteropServices.ComTypes.ELEMDESC elementDesc) { System.Runtime.InteropServices.ComTypes.TYPEDESC tdesc = elementDesc.tdesc; while ((tdesc.vt == 0x1a) || (tdesc.vt == 0x1b)) { tdesc = (System.Runtime.InteropServices.ComTypes.TYPEDESC)Marshal.PtrToStructure(tdesc.lpValue, typeof(System.Runtime.InteropServices.ComTypes.TYPEDESC)); } if (tdesc.vt == 0x1d) { IntPtr lpValue = tdesc.lpValue; IFixedTypeInfo ppTI = null; try { ((IFixedTypeInfo)typeInfo).GetRefTypeInfo(lpValue, out ppTI); this.AnalyzeTypeInfo((ITypeInfo)ppTI); } finally { if (ppTI != null) { this.marshalReleaseComObject(ppTI); } } } }
public ComTypeInfo LookupUserDefined(System.Runtime.InteropServices.ComTypes.TYPEDESC typeDesc, ComTypeInfo comTypeInfo) { if (comTypeInfo == null) { return(null); } ITypeInfo refTypeInfo = null; VarEnum variantType = (VarEnum)typeDesc.vt; if (variantType == VarEnum.VT_USERDEFINED) { IFixedTypeInfo fixedTypeInfo = (IFixedTypeInfo)comTypeInfo.GetITypeInfo(); fixedTypeInfo.GetRefTypeInfo(typeDesc.lpValue, out refTypeInfo); return(ComTypeManager.Instance.FromITypeInfo(refTypeInfo)); } return(null); }
public static string TypeDescToString(System.Runtime.InteropServices.ComTypes.TYPEDESC typeDesc, ITypeInfo typeInfo) { ITypeInfo refTypeInfo = null; VarEnum variantType = (VarEnum)typeDesc.vt; System.Runtime.InteropServices.ComTypes.TYPEDESC ptrTypeDesc; switch (variantType) { case VarEnum.VT_PTR: ptrTypeDesc = typeDesc.lpValue.ToStructure <System.Runtime.InteropServices.ComTypes.TYPEDESC>(); return(TypeDescToString(ptrTypeDesc, typeInfo)); case VarEnum.VT_USERDEFINED: //int href = (int)(typeDesc.lpValue.ToInt64() & int.MaxValue); //typeInfo.GetRefTypeInfo(href, out refTypeInfo); IFixedTypeInfo fixedTypeInfo = (IFixedTypeInfo)typeInfo; fixedTypeInfo.GetRefTypeInfo(typeDesc.lpValue, out refTypeInfo); ComTypeInfo refComTypeInfo = ComTypeManager.Instance.FromITypeInfo(refTypeInfo); return(refComTypeInfo.FullName); case VarEnum.VT_SAFEARRAY: string s = TypeDescToString(typeDesc.lpValue.ToStructure <System.Runtime.InteropServices.ComTypes.TYPEDESC>(), typeInfo); return(String.Format("{0}[]", s)); case VarEnum.VT_VOID: return("void"); default: Type t = VariantTypeToType(variantType); if (t != null) { return(t.Name); } break; } return(""); }
private void ScanImplementedTypes(ITypeInfo typeInfo, System.Runtime.InteropServices.ComTypes.TYPEATTR typeAttributes) { for (int i = 0; i < typeAttributes.cImplTypes; i++) { IFixedTypeInfo ppTI = null; try { IntPtr ptr; IFixedTypeInfo info2 = (IFixedTypeInfo)typeInfo; info2.GetRefTypeOfImplType(i, out ptr); info2.GetRefTypeInfo(ptr, out ppTI); this.AnalyzeTypeInfo((ITypeInfo)ppTI); } finally { if (ppTI != null) { this.marshalReleaseComObject(ppTI); } } } }
/// <summary> /// For a given type, analyze recursively all the types implemented by it. /// </summary> private void ScanImplementedTypes(ITypeInfo typeInfo, TYPEATTR typeAttributes) { for (int implTypeIndex = 0; implTypeIndex < typeAttributes.cImplTypes; implTypeIndex++) { IFixedTypeInfo implementedType = null; try { var fixedTypeInfo = (IFixedTypeInfo)typeInfo; fixedTypeInfo.GetRefTypeOfImplType(implTypeIndex, out IntPtr hRef); fixedTypeInfo.GetRefTypeInfo(hRef, out implementedType); AnalyzeTypeInfo((ITypeInfo)implementedType); } finally { if (implementedType != null) { _marshalReleaseComObject(implementedType); } } } }