Obtención de propiedades locales
Importante
En Visual Studio 2015, esta forma de implementar evaluadores de expresiones está en desuso. Para obtener información sobre cómo implementar evaluadores de expresiones CLR, vea Evaluadores de expresiones CLR y Ejemplo de evaluador de expresiones administradas.
Visual Studio llama a EnumChildren para obtener un objeto IEnumDebugPropertyInfo2 que proporciona acceso a todas las variables locales que se mostrarán en la ventana Variables locales . A continuación, Visual Studio llama a Next para obtener la información que se va a mostrar para cada local. En este ejemplo, la clase CEnumPropertyInfo
implementa la IEnumDebugPropertyInfo2
interfaz .
Esta implementación de IEnumDebugPropertyInfo2::Next
realiza las siguientes tareas:
Borra la matriz donde se va a almacenar la información.
Llama a Next para cada local y almacena la DEBUG_PROPERTY_INFO devuelta en la matriz que se va a devolver. El objeto IEnumDebugFields se proporcionó cuando se creó una instancia de esta
CEnumPropertyInfo
clase.
Código administrado
En este ejemplo se muestra una implementación de para las configuraciones locales de IEnumDebugPropertyInfo2::EnumChildren
un método en código administrado.
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;
}
}
}
Código no administrado
En este ejemplo se muestra una implementación de para las configuraciones locales de IEnumDebugPropertyInfo2::EnumChildren
un método en código no administrado.
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;
}