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

Страница: 476 из 528

Затем этот DWORD можно было бы использовать в соответствующем методе Unadvise:

interface IProgrammer : IUnknown {

: : :

HRESULT Unadvise([in] DWORD dwCookie);

}

для того, чтобы сообщить объекту-программисту о прерывании связи. При использовании уникальных DWORD для представления связи программист-потребитель дизайн интерфейса позволяет произвольному числу потребителей независимо друг от друга соединяться с объектом и отсоединяться от него.

Если эти два метода имеются в интерфейсе IProgrammer, то реализация программиста может быть соединена с объектом-потребителем с помощью метода Advise

STDMETHODIMP Programmer::Advise(ISoftwareConsumer *pcs, DWORD *pdwCookie)

{

assert(pcs);

if (m_pConsumer != 0) // is there already a consumer?

// уже есть потребитель?

return E_UNEXPECTED;

(m_pConsumer = pcs)->AddRef();

// hold onto new consumer

// соединяемся с новым потребителем

*pdwCookie = DWORD(pcs);

// make up a reasonable cookie

// готовим подходящий маркер

return S_OK;

}

Соответствующая реализация метода Unadvise выглядела бы примерно так:

STDMETHODIMP Programmer::Unadvise(DWORD dwCookie)

{

// does the cookie correspond to the current consumer?

// соответствует ли маркер данному потребителю?

if (DWORD(m_pConsumer) != dwCookie)

return E_UNEXPECTED;

(m_pConsumer)->Release();

// release current consumer

// освобождаем текущего потребителя

m_pConsumer = 0;

return S_OK;

}

Взаимоотношения между программистом и потребителем показаны на рис. 7.7. Хотя в данной реализации в каждый момент предусмотрен только один потребитель, возможно, что более опытный программист смог бы оперировать несколькими потребителями одновременно, управляя динамическим массивом интерфейсных указателей из ISoftwareConsumer.

|< Пред. 474 475 476 477 478 След. >|

Java книги

Контакты: [email protected]