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



         

Маршалер свободной поточной обработки (FreeThreaded Marshaler) - часть 6


// create instance of class Point // создаем экземпляр класса Point hr = CoCreateInstance(CLSID_Point, 0, CLSCTX_INPROC, IID_Ipoint, (void**)&pPoint); assert(SUCCEEDED(hr)); // register interface pointer in GIT // регистрируем интерфейсный указатель в GIT hr = g_pGIT->RegisterInterfaceInGlobal(pPoint, IID_Ipoint, &m_dwBottomRight); assert(SUCCEEDED(hr)); pPoint->Release(); // reference is now held in GIT // ссылка теперь содержится в GIT }

Отметим, что все то время, пока интерфейсный указатель зарегистрирован в GIT, пользователь интерфейсного указателя не должен хранить никаких дополнительных ссылок.

Поскольку класс был преобразован для использования GIT вместо исходных интерфейсных указателей, он должен демаршалировать новый заместитель в каждом вызове метода, которому требуется доступ к зарегистрированным интерфейсам:

STDMETHODIMP SafeRect::get_Area(long *pn) { extern IGlobalInterfaceTable *g_pGIT; assert(g_pGIT != 0); // unmarshal the two interface pointers from the GIT // демаршалируем дВа интерфейсных указателя из GIT IPoint *ptl = 0, *pbr = 0; HRESULT hr = g_pGIT->GetInterfaceFromGlobal(m_dwPtTopLeft, IID_Ipoint, (void**)&ptl); assert (SUCCEEDED(hr)); hr = g_pGIT->GetInterfaceFromGlobal(m_dwPtBottomRight, IID_Ipoint, (void**)&pbr); // use temp ptrs to implement method // дпя реализации метода используем временные указатели long top, left, bottom, right; hr = ptl->GetCoords(&left, &top); assert (SUCCEEDED(hr)); hr = pbr->GetCoords(&right, &bottom); assert (SUCCEEDED (hr)); *pn = (right - left) * (bottom - top); // release temp ptrs. // освобождаем временные указатели ptl->Release(); pbr->Release(); return S_OK; }

Поскольку реализация SafeRect использует FTM, то нецелесообразно пытаться сохранить немаршалированные интерфейсные указатели между вызовами метода, так как неизвестно, произойдет ли следующий вызов метода в том же самом апартаменте.

Все зарегистрированные интерфейсные указатели будут храниться в таблице GIT до тех пор, пока они не будут явно удалены нз GIT.


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