private static ComTypes.ITypeInfo GetCoClassTypeInfo(object rcw, ComTypes.ITypeInfo typeInfo) { Debug.Assert(typeInfo != null); IProvideClassInfo provideClassInfo = rcw as IProvideClassInfo; if (provideClassInfo != null) { IntPtr typeInfoPtr = IntPtr.Zero; try { provideClassInfo.GetClassInfo(out typeInfoPtr); if (typeInfoPtr != IntPtr.Zero) { return(Marshal.GetObjectForIUnknown(typeInfoPtr) as ComTypes.ITypeInfo); } } finally { if (typeInfoPtr != IntPtr.Zero) { Marshal.Release(typeInfoPtr); } } } // retrieving class information through IPCI has failed - // we can try scanning the typelib to find the coclass ComTypes.ITypeLib typeLib; int typeInfoIndex; typeInfo.GetContainingTypeLib(out typeLib, out typeInfoIndex); string typeName = ComRuntimeHelpers.GetNameOfType(typeInfo); ComTypeLibDesc typeLibDesc = ComTypeLibDesc.GetFromTypeLib(typeLib); ComTypeClassDesc coclassDesc = typeLibDesc.GetCoClassForInterface(typeName); if (coclassDesc == null) { return(null); } ComTypes.ITypeInfo typeInfoCoClass; Guid coclassGuid = coclassDesc.Guid; typeLib.GetTypeInfoOfGuid(ref coclassGuid, out typeInfoCoClass); return(typeInfoCoClass); }
private void AddInterface(ComTypes.ITypeInfo itfTypeInfo, bool isSourceItf) { string itfName = ComRuntimeHelpers.GetNameOfType(itfTypeInfo); if (isSourceItf) { if (_sourceItfs == null) { _sourceItfs = new LinkedList <string>(); } _sourceItfs.AddLast(itfName); } else { if (_itfs == null) { _itfs = new LinkedList <string>(); } _itfs.AddLast(itfName); } }