Getting Local Properties
Visual Studio calls IDebugProperty2::EnumChildren to obtain an IEnumDebugPropertyInfo2 object that provides access to all the locals to be displayed in the Locals window. Visual Studio then calls IEnumDebugPropertyInfo2::Next to get the information to be displayed for each local. In this example, the class CEnumPropertyInfo implements the IEnumDebugPropertyInfo2 interface.
This implementation of IEnumDebugPropertyInfo2::Next performs the following tasks:
Clears the array where the information is to be stored.
Calls IEnumDebugFields::Next for each local, storing the returned DEBUG_PROPERTY_INFO in the array to be returned. The IEnumDebugFields object was supplied when this CEnumPropertyInfo class was instantiated.
Managed Code
This example shows an implementation of IEnumDebugPropertyInfo2::EnumChildren for a method's locals in managed code.
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;
}
}
}
Unmanaged Code
This example shows an implementation of IEnumDebugPropertyInfo2::EnumChildren for a method's locals in unmanaged code.
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;
}