Сущность технологии COM



         

Специальный маршалинг - часть 4


if (dwDestCtx == MSHCTX_LOCAL dwDestCtx == MSHCTX_INPROC) return this->MyCustomMarshalingRoutine(pcb);

// unsupported context, delegate to std marshal // контекст не поддерживается, обращаемся к стандартному маршапингу IMarshal *pMsh = 0; HRESULT hr = CoGetStandardMarshal (riid, pv, dwDestCtx, pvDestCtx, mshlflags, &pMsh); if (SUCCEEDED(hr)) { hr = pMsh->GetMarshalSizeMax(pcb, riid, pv, dwDestCtx, pvDestCtx, mshlflags); pMsh->Retease(); } return hr; }

В этом фрагменте кода не показано, как писать инициализационное сообщение для случая, когда действительно желателен специальный маршалинг. Дело в том, что не существует стандартной реализации каждого из методов IMarshal (отсюда и термин специальный (custom) маршалинг). Существует, однако, несколько общих сценариев, в которых специальный маршалинг чрезвычайно выигрышен и реализация IMarshal в этих сценариях — довольно обычное явление. Безусловно, наиболее общим приложением IMarshal является реализация маршалинга по значению (marshal-by-value).

Маршалинг по значению наиболее удобен для таких объектов, которые после инициализации никогда не изменяют своего состояния. Обертки СОМ для структур — вот типичный пример объекта, который просто инициализирован, передан другому объекту для запроса и затем уничтожен. Такой объект является первым кандидатом для специального маршалинга. При реализации маршалинга по значению реализация объекта почти всегда является внутрипроцессным сервером. Это позволяет объекту и заместителю разделять один и тот же класс реализации. Идея маршалинга по значению состоит в том, что специальный заместитель становится клоном исходного объекта. Из этого следует, что маршалированная объектная ссылка должна содержать все состояние исходного объекта, а также (для простоты) то, что CLSID специального заместителя должен быть тем же, что и у исходного объекта.

Представим следующее определение класса СОМ-обертки вокруг простой двумерной точки:

class Point : public IPoint, public IMarshal { long m_x; long m_y; public: Point(void) : m_x(0), m_y(0) {} IMPLEMENT_UNKNOWN (Point) BEGIN_INTERFACE_TABLE(Point) IMPLEMENTS_INTERFACE(IPoint) IMPLEMENTS_INTERFACE(IMarshal) END_INTERFACE_TABLE() // IPoint methods // методы IPoint // IMarshal methods // методы IMarshal };




Содержание  Назад  Вперед