Obtenir les propriétés locales
Important
Dans Visual Studio 2015, cette façon d’implémenter des évaluateurs d’expression est déconseillée. Pour plus d’informations sur l’implémentation d’évaluateurs d’expression CLR, consultez l’exemple d’évaluateur d’expression CLR et d’évaluateur d’expression managée.
Visual Studio appelle EnumChildren pour obtenir un objet IEnumDebugPropertyInfo2 qui fournit l’accès à tous les locaux à afficher dans la fenêtre Locals . Visual Studio appelle ensuite Next pour obtenir les informations à afficher pour chaque local. Dans cet exemple, la classe CEnumPropertyInfo
implémente l’interface IEnumDebugPropertyInfo2
.
Cette implémentation effectue IEnumDebugPropertyInfo2::Next
les tâches suivantes :
Efface le tableau dans lequel les informations doivent être stockées.
Appelle Suivant pour chaque local, en stockant le DEBUG_PROPERTY_INFO retourné dans le tableau à renvoyer. L’objet IEnumDebugFields a été fourni lorsque cette
CEnumPropertyInfo
classe a été instanciée.
Code managé
Cet exemple montre une implémentation des IEnumDebugPropertyInfo2::EnumChildren
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;
}
}
}
Code non managé
Cet exemple montre une implémentation des IEnumDebugPropertyInfo2::EnumChildren
variables locales d’une méthode dans du 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;
}