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



Снова интерфейс и реализация - часть 3


Если префиксы совпадают, то создается новый моникер соответствующего типа и ему присваивается отображаемое имя для дальнейшего анализа. Поскольку моникеры имеют иерархическую структуру и могут быть композитными, то результирующий моникер в действительности может содержать два и более моникеров. Клиент может не заботиться об этой детали реализации. Клиент попросту использует для нахождения искомого объекта результирующий интерфейсный указатель IMoniker, который может указывать, а может не указывать на композитный моникер (composite moniker).

Напомним, что начальная точка входа в класс СОМ проходит через объект этого класса. Чтобы связаться с объектом класса, необходим моникер классового типа (Class Moniker). Это моникеры встроенного типа, предоставляемые моделью СОМ. Классовые моникеры поддерживают CLSID в качестве своего начального состояния и могут быть созданы либо с помощью явной API-функции СОМ CreateClassMoniker.

HRESULT CreateClassMoniker([in] REFCLSID rclsid, [out] IMoniker **ppmk);

либо путем передачи отображаемого имени от Class Moniker в MkParseDisplayName:

clsid:571F1680-CC83-11d0-8C48-0080C73925BA:

Отметим, что префикс "сlsid" является программным идентификатором ProgID для Class Moniker. Следующий код демонстрирует использование МkParseDisplayName для создания Class Moniker, который затем используется для связи с объектом класса Gorilla:

HRESULT GetGorillaClass(IApeClass * &rpgc) { rpgc = 0; // declare the CLSID for Gorilla as a display name // объявляем CLSID как отображаемое имя для Gorilla const OLECHAR pwsz[] = OLESTR("clsid:571F1680-CC83-11d0-8C48-0080C73925BA:"); // create a new binding context for parsing // and binding the moniker // создаем новый связующий контекст // для анализа и связывания моникера IBindCtx *pbc = 0; HRESULT hr = CreateBindCtx(0, &pbc); if (SUCCEEDED(hr)) { ULONG cchEaten; IMoniker *pmk = 0; // ask СОМ to convert the display name to a moniker object // запрашиваем СОМ преобразовать отображаемое имя // в объект моникера hr = MkParseDisplayName(pbc, pwsz, &cchEaten, &pmk); if (SUCCEEDED(hr)) { // ask the moniker to find or create the object that it // refers to // запрашиваем моникер найти или создать объект, // на который моникер ссылается hr = pmk->BindToObject(pbc, 0, IID_IApeClass, (void**)&rpgc); // we now have a pointer to the desired object, so release // the moniker and the binding context // теперь у нас есть указатель на желаемый объект, так что // освобождаем моникер и связующий контекст pmk->Release(); } pbc->Release(); } return hr; }




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