Partager via


Obtention de propriétés locales

Visual Studio appelle IDebugProperty2 : : EnumChildren pour obtenir un objet d' IEnumDebugPropertyInfo2 qui donne accès à toutes les heures locales à afficher dans la fenêtre de Variables locales . Visual Studio appelle ensuite IEnumDebugPropertyInfo2 : : suivant pour obtenir des informations à afficher pour chaque compte local. dans cet exemple, la classe CEnumPropertyInfo implémente l'interface d' IEnumDebugPropertyInfo2 .

cette implémentation d' IEnumDebugPropertyInfo2::Next effectue les tâches suivantes :

  1. Désactive le tableau dans lequel les informations doivent être inscrits.

  2. Appels IEnumDebugFields : : suivant pour chaque local, en enregistrant DEBUG_PROPERTY_INFORMATION retourné dans le tableau à retourner. L'objet d' IEnumDebugFields a été fourni lorsque cette classe d' CEnumPropertyInfo a été instanciée.

Code managé

Cet exemple montre une implémentation d' IEnumDebugPropertyInfo2::EnumChildren pour les variables locales d'une méthode dans le code managé.

namespace EEMC
{
    public class CEnumMethodField : IEnumDebugFields
    {
        public HRESULT Next(
                uint                  count,
                DEBUG_PROPERTY_INFO[] properties,
            out uint                  fetched)
        {
            if (count > properties.Length)
                throw new COMException();

            // Zero out the array.
            for (int i= 0; i < count; i++)
            {
                properties[i].bstrFullName = "";
                properties[i].bstrName = "";
                properties[i].bstrType = "";
                properties[i].bstrValue = "";
                properties[i].dwAttrib = 0;
                properties[i].dwFields = 0;
                properties[i].pProperty = null;
            }
            fetched = 0;

            // COM interop.
            HRESULT hr;
            uint innerFetched;
            IDebugField[] field = new IDebugField[1];

            while (fetched < count)
            {
                field[0] = null;
                innerFetched = 0;

                // Get next field.
                if (fetched < fieldCount)
                    hr = fields.Next(1, field, ref innerFetched);
                // No more fields.
                else return COM.S_FALSE;

                if (hr != COM.S_OK || innerFetched != 1 || field[0] == null)
                    throw new COMException("CEnumPropertyInfo.Next");

                // Get property from field.
                CFieldProperty fieldProperty = 
                    new CFieldProperty(provider, address, binder, field[0]);

                DEBUG_PROPERTY_INFO[] property =
                                new DEBUG_PROPERTY_INFO[1];
                fieldProperty.GetPropertyInfo((uint) infoFlags, radix, 0, null, 0, property);
                properties[fetched++] = property[0];
            }
            return COM.S_OK;
        }
    }
}

Le code non managé

Cet exemple montre une implémentation d' IEnumDebugPropertyInfo2::EnumChildren pour les variables locales d'une méthode dans le code non managé.

STDMETHODIMP CEnumPropertyInfo::Next(
    in  ULONG                count,
    out DEBUG_PROPERTY_INFO* pelements, 
    out ULONG*               pfetched )
{
    if (pfetched)
        *pfetched = 0;
    if (!pelements)
        return E_INVALIDARG;
    else
        memset( pelements, 0, count * sizeof(DEBUG_PROPERTY_INFO));

    HRESULT hr  = S_OK;
    ULONG   idx = 0;
    while (idx < count)
    {
        ULONG        fetchedFields;
        IDebugField* pfield;

        //get the next field
        hr = m_fields->Next( 1, &pfield, &fetchedFields );
        if (FAILED(hr))
            return hr;
        if (fetchedFields != 1)
            return E_FAIL;
        idx++;

        //create a CFieldProperty to retrieve the DEBUG_PROPERTY_INFO
        CFieldProperty* pproperty =
            new CFieldProperty( m_provider, m_address, m_binder, pfield );
        pfield->Release();
        if (!pproperty)
            return E_OUTOFMEMORY;

        hr = pproperty->Init();
        if (FAILED(hr))
        {
            pproperty->Release();
            return hr;
        }

        hr = pproperty->GetPropertyInfo( m_infoFlags,
                                         m_radix,
                                         0,
                                         NULL,
                                         0,
                                         pelements + idx - 1);
        pproperty->Release();
        if (FAILED(hr))
            return hr;
    }

    if (pfetched)
        *pfetched = idx;
    return hr;
}

Voir aussi

Concepts

Implémentation de l'exemple les variables locales

Énumérer des variables locales