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

);

Размер буфера, необходимого для маршалинга, можно определить с помощью ICallFrame::GetMarshalSizeMax:

HRESULT GetMarshalSizeMax(

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

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

ULONG * pcbBufferNeeded // необходимый размер буфера

);

Обратное преобразование буфера в стек вызова выполняется с помощью специального интерфейса ICallUnmarshal и его метода ICallUnmarshal::Unmarshal:

HRESULT Unmarshal(

ULONG iMethod, // номерметода

PVOID pBuffer, // буфер

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

BOOL fForceBufferCopy, // сохранитькопиюбуфера

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

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

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

ICallFrame ** ppFrame // ICallFrame со стеком вызова

);

Интерфейс ICallUnmarshal поддерживается перехватчиком, который мы получаем вызовом CoGetInterceptor. Таким образом, чтобы преобразовать буфер в стек вызова, нам необходимо:

создать перехватчик в адресном пространстве сервера (т.е. вызываемого компонента);

запросить у него (через QI) указатель на интерфейс ICallUnmarshal;

вызывать ICallUnmarshal::Unmarshal – мы получим указатель на интерфейс ICallFrame.

После вызова компонента обычно нужно передать выходные (out) параметры обратно клиенту. Сделать это можно парой вызовов:

ICallFrame::Marshal на серверной стороне;

ICallFrame::Unmarshal на стороне клиента.

HRESULT UnMarshal(

PVOID pBuffer, // буфер с out-параметрами

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

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

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