Condividi tramite


Ottenere proprietà locali

Chiamate IDebugProperty2:: EnumChildren di Visual Studio per IEnumDebugPropertyInfo2 ottenere un oggetto che fornisce accesso a tutti i locali da visualizzare nella finestra di locali . Chiamate IEnumDebugPropertyInfo2:: dopo di Visual Studio quindi per ottenere informazioni da visualizzare per ciascun locale. in questo esempio, la classe CEnumPropertyInfo implementa l'interfaccia di IEnumDebugPropertyInfo2 .

Questa implementazione di IEnumDebugPropertyInfo2::Next esegue le attività seguenti:

  1. Rimuove la matrice in cui le informazioni devono essere archiviate.

  2. Richieste IEnumDebugFields:: dopo per ogni locale, archiviare restituito DEBUG_PROPERTY_INFORMATION nella matrice da restituire. IEnumDebugFields L'oggetto è stato fornito quando questa classe di CEnumPropertyInfo è stata creata un'istanza.

Codice gestito

In questo esempio viene illustrata l'implementazione di IEnumDebugPropertyInfo2::EnumChildren per le variabili locali di un metodo nel codice gestito.

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;
        }
    }
}

codice non gestito

In questo esempio viene illustrata l'implementazione di IEnumDebugPropertyInfo2::EnumChildren per le variabili locali di un metodo nel codice non gestito.

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;
}

Vedere anche

Concetti

Implementazione di esempio variabili locali

Enumerazione variabili locali