Сущность технологии СОМ. Библиотека программиста

ОглавлениеДобавить в закладки К обложке

// 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

// получаем список реализованных категорий класса

HRESULT EnumImplCategoriesOfClass([in] REFCLSID rclsid,

[out] IEnumCATID** ppenumCatid);

// get list of class's required categories

// получаем список категорий, необходимых классу

HRESULT EnumReqCategoriesOfClass([in] REFCLSID rclsid,

[out] IEnumCATID** ppenumCatid);

}

Большинство этих методов возвращают свои курсоры на списки идентификаторов категории или класса. Эти указатели называются нумераторами (enumerators ) и подробно описываются в главе 7.

Следующий код показывает, как выделить список классов, являющихся членами категории Mammal:

// get the standard category manager // получаем стандартный менеджер категорий

ICatInformation *pci = 0; HRESULT hr = CoCreateInstance(

CLSID_StdComponentCategoriesMgr, 0,

CLSCTX_ALL, IID_ICatInformat1on, (void**)&pci); if (SUCCEEDED(hr)) {

// get the classes that are Simians (ignore required cats)

// получаем классы, являющиеся Simian

// (игнорируем требуемые категории)

IEnumCLSID *pec = 0;

CATID rgcid[1];

rgcid[0] = CATID_Simian;

hr = pci->EnumClassesOfCategories(1, rgcid, -1, 0, &pec);

if (SUCCEEDED(hr)) {

// walk list of CLSIDs 64 at a time

// просматриваем список CLSID no 64 за проход

enum { MAX = 64 };

CLSID rgclsid[MAX];

do {

ULONG cActual = 0;

hr = pec->Next(MAX, rgclsid, &cActual);

if (SUCCEEDED(hr)) {

for (ULONG i = 0; i < cActual; i++)

DisplayClass(rgclsid[i]);

}

}

while (hr == S_OK);

pec->Release();

}

pci->Release(); }

Этот фрагмент кода игнорирует то обстоятельство, что клиентская программа может не поддерживать нужные категории результирующего списка классов. Если бы клиент был осведомлен о том, какие локальные категории им поддерживаются, то он мог бы указать список всех поддерживаемых категорий.

Рассмотрим следующий вызов EnumClassesOfCategories:

CATID rgimpl[1]; rgimpl[0] = CATID_Simians;

CATID rgreq[3]; rgreq[0] = CATID_HasWater;

rgreq[1] = CATID_HasOxygen; rgreq[2] = CATID_HasMilk;

hr =pci->EnumClassesOfCategories(1, rgimpl, 3, rgreq, &pec);

Результирующий список классов будет содержать всех приматов (Simians), которые не требуют от среды клиента ничего, кроме кислорода (Oxygen), воды (Water) и молока (Milk). Класс Chimp, зарегистрированный ранее, мог бы быть совместимым классом, так как он реализует специфицированную категорию Simian и требует подмножество специфицированных категорий, использованных в запросе.


Логин
Пароль
Запомнить меня