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; }
ELAPI _CReflector_AcquireModuleInfo( /* [in] */ const String& name, /* [out] */ IModuleInfo** moduleInfo) { return g_objInfoList.AcquireModuleInfo(name, moduleInfo); }