Реферат: Перехват методов COM интерфейсов

hr = spFoo.CoCreateInstance(__uuidof(Foo));

CComPtr<ICallInterceptor> spInt;

hr = CoGetInterceptor(__uuidof(IFoo), 0, __uuidof(ICallInterceptor),

reinterpret_cast<void**>(&spInt));

С помощью указателя на интерфейс ICallInterceptor мы можем зарегистрировать свои собственные обработчики вызовов:

Методы ICallInterceptor Описание
HRESULT RegisterSink(ICallFrameEvents * psink); Зарегистрировать обработчик
HRESULT GetRegisteredSink(ICallFrameEvents ** ppsink); Получить зарегистрированный обработчик

ПРИМЕЧАНИЕ

Другие методы ICallInterceptor описаны в MSDN

Обработчик должен реализовать интерфейс ICallFrameEvents.

Методы ICallFraneEvent Описание
HRESULT OnCall(ICallFrame * pFrame); Вызов метода перехватываемого интерфейса

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

Дополним код клиента (см. выше) – теперь мы будем регистрировать свой обработчик вызовов:

class CallHandler : public CComObjectRoot,

public ICallFrameEvents

{

public:

BEGIN_COM_MAP(CallHandler)

COM_INTERFACE_ENTRY(ICallFrameEvents)

END_COM_MAP()

STDMETHOD(OnCall)(ICallFrame* pFrame)

{

return S_OK;

}

};

...

CComPtr<ICallInterceptor> spInt;

hr = CoGetInterceptor(__uuidof(IFoo), 0, __uuidof(ICallInterceptor),

reinterpret_cast<void**>(&spInt));

CComObject<CallHandler>* pHandler = 0;

CComObject<CallHandler>::CreateInstance(&pHandler);

hr = spInt->RegisterSink(pHandler);

К-во Просмотров: 673
Бесплатно скачать Реферат: Перехват методов COM интерфейсов