ELAPI _CObject_ReflectInterfaceInfo( /* [in] */ PInterface object, /* [out] */ IInterfaceInfo** interfaceInfo) { if (!object || !interfaceInfo) { return E_INVALID_ARGUMENT; } EIID iid; ECode ec = object->GetInterfaceID(object, &iid); if (FAILED(ec)) return E_INVALID_ARGUMENT; IObject* iObject = (IObject*)object->Probe(EIID_IObject); if (iObject == NULL) return E_NO_INTERFACE; ClassID clsid; ec = iObject->GetClassID(&clsid); if (FAILED(ec)) return E_INVALID_ARGUMENT; AutoPtr<IModuleInfo> obj; ec = _CReflector_AcquireModuleInfo(String(clsid.mUunm), (IModuleInfo**)&obj); if (FAILED(ec)) { return ec; } CModuleInfo* moduleInfo = (CModuleInfo*)obj.Get(); ClassDirEntry* classDir = NULL; ClassDescriptor* clsDesc = NULL; ClassInterface* cifDir = NULL; InterfaceDirEntry* ifDir = NULL; InterfaceDescriptor* ifDesc = NULL; UInt16 index = 0; Int32 base = moduleInfo->mClsModule->mBase; *interfaceInfo = NULL; for (Int32 i = 0; i < moduleInfo->mClsMod->mClassCount; i++) { classDir = getClassDirAddr(base, moduleInfo->mClsMod->mClassDirs, i); clsDesc = adjustClassDescAddr(base, classDir->mDesc); //find the class if (clsDesc->mClsid == clsid.mClsid) { for (Int32 j = 0; j < clsDesc->mInterfaceCount; j++) { cifDir = getCIFAddr(base, clsDesc->mInterfaces, j); index = cifDir->mIndex; ifDir = getInterfaceDirAddr(base, moduleInfo->mClsMod->mInterfaceDirs, index); ifDesc = adjustInterfaceDescAddr(base, ifDir->mDesc); //find the interface if (ifDesc->mIID == iid) { ec = g_objInfoList.AcquireInterfaceInfo( moduleInfo->mClsModule, index, (IInterface **)interfaceInfo); return ec; } } } } return E_DOES_NOT_EXIST; }
ECode CClassInfo::GetBaseClassInfo( /* [out] */ IClassInfo** baseClassInfo) { if (!baseClassInfo) { return E_INVALID_ARGUMENT; } if (!(mDesc->dwAttribs & ClassAttrib_hasparent)) { return E_DOES_NOT_EXIST; } *baseClassInfo = NULL; return g_objInfoList.AcquireClassInfo(mClsModule, getClassDirAddr(mBase, mClsMod->mClassDirs, mDesc->sParentIndex), (IInterface **)baseClassInfo); }
ELAPI _CObject_ReflectClassInfo( /* [in] */ PInterface object, /* [out] */ IClassInfo** classInfo) { if (!object || !classInfo) { return E_INVALID_ARGUMENT; } IObject* iObject = (IObject*)object->Probe(EIID_IObject); if (iObject == NULL) return E_NO_INTERFACE; ClassID clsid; ECode ec = iObject->GetClassID(&clsid); if (FAILED(ec)) { return E_NO_INTERFACE; } AutoPtr<IModuleInfo> iModuleInfo; ec = g_objInfoList.AcquireModuleInfo(String(clsid.mUunm), (IModuleInfo**)&iModuleInfo); if (FAILED(ec)) { return ec; } CModuleInfo* moduleInfo = (CModuleInfo*)iModuleInfo.Get(); ClassDirEntry* classDir = NULL; ClassDescriptor* clsDesc = NULL; Int32 base = moduleInfo->mClsModule->mBase; *classInfo = NULL; for (Int32 i = 0; i < moduleInfo->mClsMod->mClassCount; i++) { classDir = getClassDirAddr(base, moduleInfo->mClsMod->mClassDirs, i); clsDesc = adjustClassDescAddr(base, classDir->mDesc); if (clsDesc->mClsid == clsid.mClsid) { ec = g_objInfoList.AcquireClassInfo(moduleInfo->mClsModule, classDir, (IInterface **)classInfo); return ec; } } return E_DOES_NOT_EXIST; }