Получение интерфейсов ADSI из расширения
Расширение часто требует получения данных из объекта каталога, к которому он привязывается. Например, расширение для объекта компьютера может потребоваться получить dnsHostName текущего объекта из каталога. Это можно легко достичь, выполнив вызов QueryInterface в интерфейсе IUnknown для агрегатора.
HRESULT hr;
IADs *pADs; ' ADSI Interface to get/set attributes.
hr = m_pOuterUnk->QueryInterface(IID_IADs,(void**)&pADs);
if ( SUCCEEDED(hr) )
{
VARIANT var;
VariantInit(&var);
hr = pADs ->Get(_bstr_t("dnsHostName"), &var);
if ( SUCCEEDED(hr) )
{
printf("%S\n", V_BSTR(&var));
}
VariantClear(&var);
pADs->Release();
}
Вы должны освободить интерфейс сразу после его использования. Если расширение имеет открытую ссылку на агрегат, вы создали циклическую ссылку, и агрегатор не может освободить расширение. Поэтому агрегатор не может быть освобожден, и результатом является утечка памяти в приложении.