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



         

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


// get а local interface pointer from GIT // получаем локальный интерфейсный указатель из GIT HRESULT Localize(Itf **ppItf) const { assert(g_pGIT != 0 && m_dwCookie != 0); return g_pGIT->GetInteгfaceFromGlobal(m_dwCookie, *piid, (void**)ppItf); }

// convenience methods // методы для удобства bool IsOK(void) const { return m_dwCookie != 0; } DWORD GetCookie(void) const { return m_dwCookie; } };

#define GIP(Itf) GlobalInterfacePointer<Itf, &IID_##Itf>

Имея данное определение класса и макрос, класс SafeRect теперь вместо исходных DWORD сохраняет GlobalInterfacePointers:

class SafeRect : public IRect { LONG m_cRef: // СОM reference count // счетчик ссылок СОМ IUnknown *m_pUnkFTM; // cache for FTM lazy aggregate // кэш дпя отложенного агрегирования FTM GIP(IPoint) m_gipTopLeft; // GIT cookie - top/left // "закладка" GIT для верхнего/левого элемента GIP(IPoint) m_gipBottomRight; // GIT cookie - bottom/right // "закладка" GIT для нижнего/правого элемента : : : }

Для инициализации элемента GlobalInterfacePointer разработчик (который выполняется в апартаменте объекта) просто регистрирует обрабатываемые указатели, вызывая метод Globalize на каждый GlobalInterfacePointer:

SafeRect::SafeRect(void) : m_cRef (0), m_pUnkFTM(0) { IPoint *pPoint = 0; // create instance of class Point // создаем экземпляр класса Point HRESULT hr = CoCreateInstance(CLSID_Point, 0, CLSCTX_INPROC, IID_Ipoint, (void**)&pPoint); assert (SUCCEEDED(hr)); // register interface pointer in GIT // регистрируем интерфейсный указатель в GIT hr = m_gipTopLeft.Globalize(pPoint); assert (SUCCEEDED(hr)); pPoint->Release(); // reference is now held in GIT // теперь ссыпка хранится в GIT // create instance of class Point // создаем экземпляр класса Point hr = CoCreateInstance(CLSID_Point, 0, CLSCTX_INPROC, IID_Iроint, (void**) &рРоint); assert(SUCCEEDED(hr)); // register interface pointer in GIT // регистрируем интерфейсный указатель в GIT hr = m_gipBottomRight.Globalize(pPoint); assert (SUCCEEDED (hr)); pPoint->Release(); // reference is now held in GIT // теперь ссылка хранится в GIT }




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