Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Seit Visual Studio 2015 ist diese Art der Implementierung von Ausdrucksauswertungen veraltet. Informationen zum Implementieren von CLR-Ausdrucksauswertungen finden Sie unter CLR-Ausdrucksauswertungen und Beispiel für die Auswertung verwalteter Ausdrücke.
Visual Studio ruft EnumChildren auf, um ein IEnumDebugPropertyInfo2-Objekt abzurufen, das Zugriff auf alle Lokalisierer bietet, die im Fenster "Lokal" angezeigt werden sollen. Visual Studio ruft dann "Weiter" auf, um die Informationen abzurufen, die für jede lokale Person angezeigt werden sollen. In diesem Beispiel implementiert die Klasse CEnumPropertyInfo die IEnumDebugPropertyInfo2 Schnittstelle.
Diese Implementierung führt IEnumDebugPropertyInfo2::Next die folgenden Aufgaben aus:
Löscht das Array, in dem die Informationen gespeichert werden sollen.
Calls Next for each local, speicher the returned DEBUG_PROPERTY_INFO in the array to be returned. Das IEnumDebugFields-Objekt wurde beim Instanziieren dieser
CEnumPropertyInfoKlasse bereitgestellt.
Verwalteter Code
Dieses Beispiel zeigt eine Implementierung der IEnumDebugPropertyInfo2::EnumChildren Gebietsschemas einer Methode im verwalteten 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;
}
}
}
Nicht verwalteter Code
Dieses Beispiel zeigt eine Implementierung der IEnumDebugPropertyInfo2::EnumChildren Lokalen einer Methode im nicht verwalteten 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;
}