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



         

Межапартаментный доступ - часть 6


Для того чтобы декодировать маршалированную объектную ссылку, созданную в предыдущем фрагменте кода, в нормальный интерфейсный указатель, импортирующему апартаменту необходимо вызвать API-функцию CoUnmarshalInterface:

HRESULT CoUnmarshalInterface( [in] IStream *pStm, // where to read marshaled state // откуда читать маршалированное состояние [in] REFIID riid, // type of ptr being unmaгshaled // тип демаршалируемого указателя [out, iid_is(riid)] void **ppv // where to put unmarshaled ptr // куда поместить демаршалированный указатель );

Рис. 5.1. Маршалированная объектная ссылка

CoUnmarshalInterface просто читает преобразованную в последовательную форму объектную ссылку и возвращает указатель на исходный объект, к которому есть легальный доступ в апартаменте вызывающего потока. Если импортирующий апартамент отличается от того апартамента, который изначально экспортировал интерфейс, то результирующий указатель будет указателем на заместитель. Если по какой-то причине вызов CoUnmarshalInterface осуществлен из исходного апартамента, где располагается объект, то в этом случае будет возвращен указатель на сам объект и не будет создано никакого заместителя. Следующий код переводит маршалированную объектную ссылку в нормальный указатель интерфейса:

HRESULT ReadPtr(HGLOBAL hglobal, IRacer * &rpRacer) { IStream *pStm = 0; rpRacer = 0; // wrap block of existing memory passed on input // заключаем в оболочку блок существующей памяти, // переданный на вход HRESULT hr = CreateStreamOnHGlobal(hglobal, FALSE, &pStm); if (SUCCEEDED(hr)) { // get a pointer to the object that is legal in this apt. // получаем указатель на объект, легальный в этом апартаменте hr = CoUnmarshalInterface(pStm, IID_Iracer, (void**)&rpRacer); pStm->Release(); } return hr; }

Результирующий заместитель будет реализовывать каждый из экспортируемых объектом интерфейсов путем переадресации запросов методов в апартамент объекта.

До появления выпуска СОМ под Windows NT 4.0 формат маршалированной объектной ссылки не был документирован.


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