Поделиться через


Получение интерфейсов 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();
}

Вы должны освободить интерфейс сразу после его использования. Если расширение имеет открытую ссылку на агрегат, вы создали циклическую ссылку, и агрегатор не может освободить расширение. Поэтому агрегатор не может быть освобожден, и результатом является утечка памяти в приложении.