Сущность технологии СОМ. Библиотека программиста :: Бокс Дональд
Страница:
484 из 528
Для того чтобы объект Surfboard не уничтожил себя раньше времени, подобъекты администратора соединений просто делегируют вызовы своих методов AddRef и Release в содержащий их объект surfboard:
STDMETHODIMP_(ULONG) Surfboard::XCPShutdownNotify::AddRef(void)
{
return This()->AddRef();
/* AddRef containing object */
/* AddRef объекта-контейнера */
}
STDMETHODIMP_(ULONG) Surfboard::XCPShutdownNotify::Release(void)
{
return This()->Release();
/* Release containing object */
/* Release объекта-контейнера */
}
В приведенных выше методах предполагается, что метод This возвращает указатель на объект-контейнер Surfboard, используя вычисление некоторого постоянного смещения.
Клиенты находят интерфейсы объекта IConnectionPoint посредством вызова метода объекта FindConnectionPoint, который для класса Surfboard мог бы выглядеть примерно так:
STDMETHODIMP Surfboard::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
{
if (riid == IID_IShutdownNotify)
*ppcp = IID_IShutdownNotify;
else if (riid == IID_ISurfboardUser)
*ppcp = &m_xcpSurfboardUser;
else
return (*ppcp = 0), CONNECT_E_NOCONNECTION;
(*ppcp)->AddRef();
return S_OK;
}
Отметим, что объект выдает интерфейсные указатели IConnectionPoint только при запросе тех интерфейсов, на которые он сможет сделать обратный запрос. Необходимо указать также на поразительное сходство с большинством реализации QueryInterface. Основное различие состоит в том, что QueryInterface имеет дело с импортируемыми (inbound) интерфейсами, в то время как FindConnectionPoint – с экспортируемыми (outbound) интерфейсами.
|< Пред. 482 483 484 485 486 След. >|