функция GetHGlobalFromStream позволяет вызывающему объекту
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, то импортирующий апартамент может находиться на другой хост-машине.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий