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

HRESULT hr = pFrame->GetNames(&itf, &method);

hr = pFrame->Invoke(m_spItf.p);

ATLTRACE("call %s::%s %8x\n", itf, method, hr);

CoTaskMemFree(itf);

CoTaskMemFree(method);

return hr;

}

private:

CComPtr<T> m_spItf;

};

Вызывая ICallFrame::Invoke, мы не передаем никаких параметров – значения для параметров перехватываемого метода были переданы клиентом, когда он выполнял вызов через перехватчик.

ПРИМЕЧАНИЕ

Метод ICallFrame::Invoke имеет переменное количество параметров (что редко встречается у COM-интерфейсов). Если стек параметров вызова заполнен только частично, в Invoke могут передаваться дополнительные параметры вызова (которые будут добавлены в стек перед вызовом).

Косвенные и асинхронные/отложенные вызовы

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

С помощью перехватчиков COM+ можно выполнять косвенные и асинхронные вызовы. Вместо прямого вызова ICallFrame::Invoke мы можем:

сохранить содержимое параметров, находящихся в стеке, в специальный буфер (фактически выполнить маршалинг параметров);

передать их с помощью любого доступного транспорта (RPC, MSMQ, SOAP, файлы и т.п.) компоненту;

выполнить вызов;

получить значения [out] параметров, выполнить обратный маршалинг;

передать значения параметров клиенту с помощью любого доступного транспорта.

Для упаковки стека вызова, т.е. маршалинга предназначен метод ICallFrame::Marshal:

HRESULT Marshal(

CALLFRAME_MARSHALCONTEXT * pmshlContext, // контекст (т.e. inproc ит.п.)

MSHLFLAGS * mshlflags, // обычный или табличный маршалинг

PVOID pBuffer, // буфер

ULONG cbBuffer, // размер буфера

ULONG * pcBufferUsed, // использованный размер буфера

RPCOLEDATAREP * pdataRep, // формат представления данных

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