Сущность технологии СОМ. Библиотека программиста | страница 119
rgcc[0].lcid = rgcc[1].lcid = rgcc[2].lcid = rgcc[3].lcid = 0х409;
wcscpy(rgcc[0].szDescription, OLESTR(«Eats Bananas»));
wcscpy(rgcc[1].szDescription, OLESTR(«Bears live young»));
wcscpy(rgcc[2].szDescription, OLESTR(«Provides Oxygen»));
wcscpy(rgcc[3].szDescription, OLESTR(«Provides Water»));
// register information regarding categories
// регистрируем информацию о категориях
pcr->RegisterCategories(4, rgcc);
// note that Chimps are Simians and mammals
// отметим, что Chimps (шимпанзе) являются Simian
// (обезьянами) и Mammal (млекопитающими)
CATID rgcid[2];
rgcid[0] = CATID_Simian;
rgcid[1] = CATID_Mammal;
pcr->RegisterClassImplCategories(CLSID_Chimp, 2, rgcid);
// note that Chimps require Oxygen and Water
// отметим, что Chimps (шимпанзе) нуждаются
// в кислороде (Oxygen) и воде (Water)
rgcid[0] = CATID_HasOxygen;
rgcid[1] = CATID_HasWater;
pcr->RegisterClassReqCategories(CLSID_Chimp, 2, rgcid);
pcr->Release(); }
Заметим, что в этом коде не делается обычных вызовов реестровых API-функций, а вместо них для обработки реестра используется стандартный менеджер категорий.
Кроме того, стандартный менеджер категорий позволяет приложениям запрашивать реестр найти информацию о категориях. Эта функциональная возможность предоставляется через интерфейс ICatInformation:
[object, uuid(0002E013-0000-0000-C000-000000000046)]
interface ICatInformation : IUnknown
{
// get list of known categories
// получаем список известных категорий
HRESULT EnumCategories([in] LCID lcid, [out] IEnumCATEGORYINFO** ppeci);
// get description of a particular category
// получаем описание определенной категории
HRESULT GetCategoryDesc([in] REFCATID rcatid, [in] LCID lcid, [out] OLECHAR ** ppszDesc);
// get list of classes compatible with specified categories
// получаем список классов, совместимых с указанными категориями
HRESULT EnumClassesOfCategories(
[in] ULONG cImplemented,
// -1 indicates ignore
// (-1) означает игнорировать
[in,size_is(cImplemented)] CATID rgcatidImpl[], [in] ULONG cRequired,
// -1 indicates ignore
// (-1) означает игнорировать
[in,size_is(cRequired)] CATID rgcatidReq[], [out] IEnumCLSID** ppenumClsid);
// verify class is compatible with specified categories
// проверяем, совместим ли класс с указанными категориями
HRESULT IsClassOfCategories([in] REFCLSID rclsid,
[in] ULONG cImplemented,
[in,size_is(cImplemented)] CATID rgcatidImpl[],
[in] ULONG cRequired,
[in,size_is(cRequired)] CATID rgcatidReq[]);
// get list of class's implemented categories