/// <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);
                    }
                }
            }
        }
Beispiel #2
0
 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);
        }
Beispiel #4
0
        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("");
        }
Beispiel #5
0
 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);
                    }
                }
            }
        }