а local interface pointer from
// 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 }
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий