Сущность технологии COM



Категории компонентов - часть 6


Следующий код показывает, как выделить список классов, являющихся членами категории 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 и требует подмножество специфицированных категорий, использованных в запросе.

Заключительным, причем спорным, аспектом категорий компонентов является представление о классе по умолчанию для категории.СОМ допускает регистрацию CATID в качестве CLSID под ключом реестра

HKEY_CLASSES_ROOT\CLSID

Для преобразования CATID в CLSID по умолчанию используется средство TreatAs, введенное эмуляцией. Для указания того, что класс Gorilla является классом по умолчанию для Simian, необходимо добавить следующий ключ реестра:

[HKCR\CLSID\{CATID_Simian}\TreatAs] @={CLSID_Gorilla}

Это простое соглашение позволяет клиентам просто использовать CATID там, где ожидаются CLSID:

// create an instance of the default Simian class // создаем экземпляр класса Simian, принятого по умолчанию hr = CoCreateInstance(CATID_Simian, 0, CLSCTX_ALL, IID_IApe, (void**)&pApe);

Если для указанной категории не зарегистрировано ни одного класса по умолчанию, то вызов активации даст сбой и вернет REGDB_E_CLASSNOTREG.




Содержание  Назад  Вперед