Partager via


Liaison à des objets enfants

Dans ADSI, un objet conteneur expose l’interface IADsContainer . La méthode IADsContainer::GetObject est utilisée pour lier directement à un objet enfant. L’objet retourné par IADsContainer::GetObject a le même contexte de sécurité que l’objet sur lequel la méthode a été appelée. Cela signifie que si d’autres informations d’identification sont utilisées, elles n’ont pas besoin d’être passées à la fonction de liaison ou à la méthode pour conserver les mêmes informations d’identification.

La méthode IADsContainer::GetObject prend un nom unique relatif (RDN) relatif à l’objet actuel. Cette méthode prend également un nom de classe facultatif et retourne un pointeur d’interface IDispatch qui représente l’objet enfant. Pour obtenir l’interface ADSI souhaitée, telle que les IAD, appelez la méthode QueryInterface de ce pointeur d’interface IDispatch .

L’exemple de code C++ suivant montre une fonction qui récupère un objet enfant spécifié.

HRESULT GetChildObject(IADs *pObject, 
                       LPCWSTR pwszClass, 
                       LPCWSTR pwszRDN, 
                       IADs **ppChild)
{
    if(NULL == ppChild)
    {
        return E_INVALIDARG;
    }

    *ppChild = NULL;
    
    if((NULL == pObject) || (NULL == pwszRDN))
    {
        return E_INVALIDARG;
    }

    HRESULT hr;
    IADsContainer *pCont;

    hr = pObject->QueryInterface(IID_IADsContainer, (LPVOID*)&pCont);
    if(SUCCEEDED(hr))
    {
        BSTR bstrClass = NULL;
        if(pwszClass)
        {
            bstrClass = SysAllocString(pwszClass);
        }

        BSTR bstrRDN = SysAllocString(pwszRDN);
        if(bstrRDN)
        {
            IDispatch *pDisp;
            
            hr = pCont->GetObject(bstrClass, bstrRDN, &pDisp);
            if(SUCCEEDED(hr))
            {
                hr = pDisp->QueryInterface(IID_IADs, (LPVOID*)ppChild);
                
                pDisp->Release();
            }

        }
        else
        {
            hr = E_OUTOFMEMORY;
        }

        if(bstrRDN)
        {
            SysFreeString(bstrRDN);
        }

        if(bstrClass)
        {
            SysFreeString(bstrClass);
        }


        pCont->Release();
    }
    
    return hr;
}