Реферат: Перехват методов интерфейса Iunknown
CComCritSecLock<CComAutoCriticalSection> lock(m_csHooks);
HookMap::iterator it = m_hooks.lower_bound(tmp);
if (it == m_hooks.end() || (*it).first != tmp) //а нет ли уже такого хука?
{
// ставим новый хук
// по хорошему, тут бы стоило еще проверять, не вернул ли new 0
HookPtr pNewHook(new HookEntry()); //
if (pNewHook->Hook(pItf))
{
m_hooks.insert(it, HookMap::value_type(tmp, pNewHook));
//предотвращаем преждевременную выгрузку dll
if (++m_totalRefCount == 1)
_Module.Lock();
}
else
return NULL;
}
else
(*it).second->AddRef(); //хук уже есть. просто добавляем ссылку
} //lock.Unlock();
//добавляем или достаем credentials
CComCritSecLock<CComAutoCriticalSection> lock2(m_csCredentials);
CredentialsMap::iterator itc = m_credentials.lower_bound(pItf);
//такого элемента еще нет – придется добавить
if (itc == m_credentials.end() || (*itc).first != pItf)
{
m_credentials.insert(itc, CredentialsMap::value_type(pItf, pCredentials));
return pCredentials->GetCredentials();
}