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



         

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


API-функция GetHGlobalFromStream позволяет вызывающему объекту получать дескриптор (handle) памяти, выделенной функцией CreateStreamOnHGlobal. Использование HGLOBAL сложилось исторически и никоим образом не означает использование разделяемой памяти.

После осмысления всех типов параметров API-функции CoMarshalInterface она выглядит достаточно просто:

HRESULT CoMarshalInterface( [in] IStream *pStm, // where to write marshaled state // куда записывать маршалированное состояние [in] REFIID riid, // type of ptr being marshaled // тип маршалируемого указателя [in, iid_is(riid)] IUnknown *pItf, // pointer being marshaled // маршалируемый указатепь [in] DWORD dwDestCtx, // MSHCTX for destination apt. // MSHCTX для апартамента адресата [in] void *pvDestCtx, // reserved, must be zero // зарезервирован, должен равняться нулю [in] DWORD dwMshlFlags // normal, vs. table marshal // нормальный маршалинг против табличного );

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

HRESULT WritePtr(IRacer *pRacer, HGLOBAL& rhglobal) { IStream *pStm = 0; гhglobal = 0; // alloc and wrap block of memory // выделяем и заворачиваем блок памяти HRESULT hr = CreateStreamOnHGlobal(0, FALSE, &pStm); if (SUCCEEDED(hr)) { // write marshaled object reference to memory // записываем в память маршалированную объектную ссылку hr = CoMarshalInterface(pStm, IID_Iracer, pRacer, MSHCTX_DIFFERENTMACHINE, 0, MSHLFLAGS_NORMAL); // extract handle to underlying memory // извлекаем дескриптор памяти if (SUCCEEDED(hr)) hr = GetHGlobalFromStream(pStm, &rhglobal); pStm->Release(); } return hr; }

Рисунок 5.1 иллюстрирует взаимоотношения между интерфейсным указателем и памятью, содержащей маршалированную объектную ссылку. После вызова CoMarshalInterface апартамент объекта готов получить от другого апартамента запрос на соединение. Поскольку был использован флаг MSHCTX_DIFFERENTMACHINE, то импортирующий апартамент может находиться на другой хост-машине.




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