private static void ProcessFunctions(UnsafeNativeMethods.ITypeInfo typeInfo, IDictionary propInfoList, int dispidToGet, int nameDispID, ref bool addAboutBox, StructCache structCache) { IntPtr zero = IntPtr.Zero; int typeAttr = typeInfo.GetTypeAttr(ref zero); if (!System.Windows.Forms.NativeMethods.Succeeded(typeAttr) || (zero == IntPtr.Zero)) { throw new ExternalException(System.Windows.Forms.SR.GetString("TYPEINFOPROCESSORGetTypeAttrFailed", new object[] { typeAttr }), typeAttr); } System.Windows.Forms.NativeMethods.tagTYPEATTR data = (System.Windows.Forms.NativeMethods.tagTYPEATTR) structCache.GetStruct(typeof(System.Windows.Forms.NativeMethods.tagTYPEATTR)); UnsafeNativeMethods.PtrToStructure(zero, data); try { if (data != null) { System.Windows.Forms.NativeMethods.tagFUNCDESC gfuncdesc = (System.Windows.Forms.NativeMethods.tagFUNCDESC) structCache.GetStruct(typeof(System.Windows.Forms.NativeMethods.tagFUNCDESC)); System.Windows.Forms.NativeMethods.tagELEMDESC structure = (System.Windows.Forms.NativeMethods.tagELEMDESC) structCache.GetStruct(typeof(System.Windows.Forms.NativeMethods.tagELEMDESC)); for (int i = 0; i < data.cFuncs; i++) { IntPtr pFuncDesc = IntPtr.Zero; if (System.Windows.Forms.NativeMethods.Succeeded(typeInfo.GetFuncDesc(i, ref pFuncDesc)) && (pFuncDesc != IntPtr.Zero)) { UnsafeNativeMethods.PtrToStructure(pFuncDesc, gfuncdesc); try { if ((gfuncdesc.invkind == 1) || ((dispidToGet != -1) && (gfuncdesc.memid != dispidToGet))) { if (gfuncdesc.memid == -552) { addAboutBox = true; } } else { System.Windows.Forms.NativeMethods.tagTYPEDESC tdesc; bool flag = gfuncdesc.invkind == 2; if (flag) { if (gfuncdesc.cParams != 0) { continue; } tdesc = gfuncdesc.elemdescFunc.tdesc; } else { if ((gfuncdesc.lprgelemdescParam == IntPtr.Zero) || (gfuncdesc.cParams != 1)) { continue; } Marshal.PtrToStructure(gfuncdesc.lprgelemdescParam, structure); tdesc = structure.tdesc; } PropInfo info = ProcessDataCore(typeInfo, propInfoList, gfuncdesc.memid, nameDispID, tdesc, gfuncdesc.wFuncFlags, structCache); if ((info != null) && !flag) { info.ReadOnly = 2; } } } finally { typeInfo.ReleaseFuncDesc(pFuncDesc); } } } structCache.ReleaseStruct(gfuncdesc); structCache.ReleaseStruct(structure); } } finally { typeInfo.ReleaseTypeAttr(zero); structCache.ReleaseStruct(data); } }