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



         

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


Это означает, что класс SafeRect должен явно аннулировать элементы GIT для двух своих элементов данных:

SafeRect::~SafeRect(void) { extern IGlobalInterfaceTable *g_pGIT; assert(g_pGIT != 0); HRESULT hr = g_pGIT->RevokeInterfaceFromGlobal(m_dwTopLeft); assert(SUCCEEDED(hr)); hr = g_pGIT->RevokeInterfaceFromGlobal(m_dwBottomRight); assert(SUCCEEDED(hr)); }

Удаление интерфейсного указателя из GIT освобождает все хранящиеся ссылки на объект.

Отметим, что совместное использование GIT и FTM влечет за собой очень много обращений к GIT, которые будут сделаны для создания временных интерфейсных указателей, необходимых для использования в каждом отдельном методе. Хотя GIT оптимизирована именно для поддержки такой схемы использования, код остается однообразным. Следующий простой класс C++ скрывает использование "закладки" GIT за удобным интерфейсом, обеспечивающим безопасность типа:

template <class Itf, const IID* piid> class GlobalInterfacePointer { DWORD m_dwCookie; // the GIT cookie // "закладка" GIT // prevent misuse // предотвращаем неправильное использование GlobalInterfacePointer(const GlobalInterfacePointer&); void operator =(const GlobalInterfacePointer&); public:

// start as invalid cookie // начинаем как неправильная "закладка" GlobalInterfacePointer(void) : m_dwCookie(0) { }

// start with auto-globalized local pointer // начинаем с автоматически глобализованным локальным указателем GlobalInterfacePointer(Itf *pItf, HRESULT& hr) : m_dwCookie(0) { hr = Globalize(pItf); }

// auto-unglobalize // осуществляем автоматическую деглобапизацию ~GlobalInterfacePointer(void) { if(m_dwСооkiе) Unglobalize() ; }

// register an interface pointer in GIT // регистрируем интерфейсный указатель в GIT HRESULT Globalize(Itf *pItf) { assert (g_pGIT != 0 && m_dwCookie == 0); return g_pGIT->RegisterInterfaceInGlobal(pItf, * piid, &m_dwCookie); }

// revoke an interface pointer in GIT // аннулируем интерфейсный указатель в GIT HRESULT Unglobalize(void) { assert(g_pGIT != 0 && m_dwCookie != 0); HRESULT hr = g_pGIT->RevokeInterfaceFromGlobal(m_dwCookie); m_dwCookie = 0; return hr; }




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