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; }
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; }
CClassInfo::CClassInfo( /* [in] */ CClsModule* clsModule, /* [in] */ ClassDirEntry* clsDirEntry) { mClsModule = clsModule; mClsMod = mClsModule->mClsMod; mClassDirEntry = clsDirEntry; mIFList = NULL; mCBIFList = NULL; mCBMethodDesc = NULL; mMethodCount = 0; mCBMethodCount = 0; mCBIFCount = 0; mIFCount = 0; mBase = mClsModule->mBase; mDesc = adjustClassDescAddr(mBase, mClassDirEntry->mDesc); mClsId.pUunm = mUrn; mClsId.clsid = mDesc->clsid; strcpy(mClsId.pUunm, adjustNameAddr(mBase, mClsMod->mUunm)); }