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



Использование SCM - часть 3


Имея в наличии CoGetClassObject, клиент может дать запрос SCM на связывание указателя интерфейса с объектом класса:

HRESULT GetGorillaClass(IApeClass * &rpgc) { // declare the CLSID for Gorilla as a GUID // определяем CLSID для Gorilla как GUID const CLSID CLSID_Gorilla = { 0x571F1680, 0xCC83, 0x11d0, { 0x8C, 0х48, 0х00, 0х80, 0xС7, 0х39, 0x25, 0xBA } }; // call CoGetClassObject directly // вызываем прямо CoGetClassObject return CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL, 0, IID_IApeClass, (void**)&rpgc); }

Отметим, что если запрошенный класс доступен как внутрипроцессный сервер, то СОМ автоматически загрузит соответствующую DLL и вызовет известную экспортируемую функцию, которая возвращает указатель на требуемый объект класса. Когда вызов CoGetClassObject завершен, библиотека СОМ и SCM полностью выходят из игры. Если бы класс был доступен только с внепроцессного или удаленного сервера, СОМ вместо этого возвратила бы заместитель, который позволил бы клиенту получить удаленный доступ к объекту класса.

Напомним, что интерфейс IApeClass придуман для того, чтобы позволить клиентам находить или создавать экземпляры заданного класса. Рассмотрим следующий пример:

HRESULT FindAGorillaAndEatBanana(long nGorillaID) { IApeClass *pgc = 0; // find the class object via CoGetClassObject // находим объект класса с помощью CoGetClassObject HRESULT hr = CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL, 0, IID_IApeClass, (void**)&pgc); if (SUCCEEDED(hr)) { IApe *pApe = 0; // use the class object to find an existing gorilla // используем объект класса для нахождения существующей гориллы hr = pgc->GetApe(nGorillaID, &pApe); if (SUCCEEDED(hr)) { // tell the designated gorilla to eat a banana // прикажем указанной горилле есть бананы hr = pApe->EatBanana(); pApe->Release(); } pgc->Release(); } return hr; }

Данный пример использует объект класса для того, чтобы Gorilla нашла именованный объект и проинструктировала его есть бананы. Чтобы этот пример работал, нужно, чтобы какой-нибудь внешний посредник дал вызывающему объекту имя какой-нибудь известной гориллы.


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