지역 변수를 열거합니다.
Visual Studio 채울 수 있을 때의 지역 창을 호출 IDebugProperty2::EnumChildren 에 IDebugProperty2 개체에서 반환 된 IDebugExpressionEvaluator::GetMethodProperty (참조 하십시오 Getmethodproperty를 구현합니다.). IDebugProperty2::EnumChildren반환 된 IEnumDebugPropertyInfo2 개체입니다.
이 구현의 IDebugProperty2::EnumChildren 다음 작업을 수행 합니다.
이 메서드를 나타내는 것을 보장 합니다.
사용 하는 guidFilter 에서 호출할 메서드를 결정 하는 인수는 IDebugMethodField 개체입니다. 경우 guidFilter 와 같습니다.
guidFilterLocals를 호출 IDebugMethodField::EnumLocals 얻을 수는 IEnumDebugFields 개체입니다.
guidFilterArgs를 호출 IDebugMethodField::EnumArguments 얻을 수는 IEnumDebugFields 개체입니다.
guidFilterLocalsPlusArgs를 열거의 결과를 결합 하 여 합성 IDebugMethodField::EnumLocals 및 IDebugMethodField::EnumArguments. 이 합성 클래스에 의해 표시 됩니다 CEnumMethodField.
클래스를 인스턴스화합니다 (라는 CEnumPropertyInfo 예제에서) 구현 하는 IEnumDebugPropertyInfo2 인터페이스 및 포함 된는 IEnumDebugFields 개체입니다.
반환은 IEnumDebugProperty2Info2 에서 인터페이스는 CEnumPropertyInfo 개체입니다.
관리 코드
구현 하는이 예제를 보여 줍니다. IDebugProperty2::EnumChildren 관리 되는 코드입니다.
namespace EEMC
{
public class CFieldProperty : IDebugProperty2
{
public HRESULT EnumChildren (
uint dwFields,
uint radix,
ref Guid guidFilter,
ulong attribFilter,
string nameFilter,
uint timeout,
out IEnumDebugPropertyInfo2 properties)
{
properties = null;
IEnumDebugFields fields = null;
// If this field is a method...
if (0 != ((uint) fieldKind & (uint) FIELD_KIND.FIELD_TYPE_METHOD))
{
IDebugMethodField methodField = (IDebugMethodField) field;
// Enumerate parameters.
if (guidFilter == FilterGuids.guidFilterArgs)
{
methodField.EnumParameters(out fields);
}
// Enumerate local variables.
else if (guidFilter == FilterGuids.guidFilterLocals)
{
methodField.EnumLocals(address, out fields);
}
// Enumerate all local variables, including invisible compiler temps.
else if (guidFilter == FilterGuids.guidFilterAllLocals)
{
methodField.EnumAllLocals(address, out fields);
}
// Enumerate "this", if any, and all parameters and local variables.
else if (guidFilter == FilterGuids.guidFilterLocalsPlusArgs)
{
IDebugClassField fieldThis = null;
IEnumDebugFields parameters = null;
IEnumDebugFields locals = null;
methodField.GetThis(out fieldThis);
methodField.EnumParameters(out parameters);
methodField.EnumLocals(address, out locals);
CEnumMethodField enumMethodField =
new CEnumMethodField(fieldThis, parameters, locals);
fields = (IEnumDebugFields) enumMethodField;
}
// Enumerate only "this".
else if (guidFilter == FilterGuids.guidFilterThis)
{
IDebugClassField fieldThis = null;
methodField.GetThis(out fieldThis);
CEnumMethodField enumMethodField =
new CEnumMethodField(fieldThis, null, null);
fields = (IEnumDebugFields) enumMethodField;
}
else throw new COMException();// E_FAIL
}
// Wrap a property enumerator around the field enumerator.
CEnumPropertyInfo propertiesInfo =
new CEnumPropertyInfo(provider, address, binder, radix, fields,
(DEBUGPROP_INFO_FLAGS) dwFields);
properties = (IEnumDebugPropertyInfo2) propertiesInfo;
return COM.S_OK;
}
}
}
관리 되지 않는 코드
구현 하는이 예제를 보여 줍니다. IDebugProperty2::EnumChildren 에서 관리 되지 않는 코드입니다.
STDMETHODIMP CFieldProperty::EnumChildren(
in DEBUGPROP_INFO_FLAGS infoFlags,
in DWORD radix,
in REFGUID guidFilter,
in DBG_ATTRIB_FLAGS attribFilter,
in LPCOLESTR pszNameFilter,
in DWORD timeout,
out IEnumDebugPropertyInfo2 ** ppchildren )
{
if (ppchildren == NULL)
return E_INVALIDARG;
else
*ppchildren = 0;
//get enumeration
HRESULT hr;
IEnumDebugFields* pfields = NULL;
if (m_fieldKind & FIELD_TYPE_METHOD)
{
//-----------------------------------------------------
// A Method
IDebugMethodField* pmethod = NULL;
//enumerate the requested properties
hr = m_field->QueryInterface( IID_IDebugMethodField,
reinterpret_cast<void**>(&pmethod) );
if (FAILED(hr))
return hr;
if (guidFilter == guidFilterArgs)
{
hr = pmethod->EnumParameters( &pfields );
}
else if (guidFilter == guidFilterLocals)
{
hr = pmethod->EnumLocals( m_address, &pfields );
}
else if (guidFilter == guidFilterAllLocals)
{
hr = pmethod->EnumAllLocals( m_address, &pfields );
}
else if (guidFilter == guidFilterLocalsPlusArgs)
{
//we create a special enumerator for this
IDebugClassField* pfieldThis = NULL;
IEnumDebugFields* pparameters = NULL;
IEnumDebugFields* plocals = NULL;
pmethod->GetThis( &pfieldThis );
pmethod->EnumParameters( &pparameters );
pmethod->EnumLocals( m_address, &plocals );
CEnumMethodField* penumMethodField =
new CEnumMethodField( pfieldThis, pparameters, plocals );
if (pfieldThis != NULL)
pfieldThis->Release();
if (pparameters != NULL)
pparameters->Release();
if (plocals != NULL)
plocals->Release();
if (!penumMethodField)
{
hr = E_OUTOFMEMORY;
}
else
{
hr = penumMethodField->QueryInterface( IID_IEnumDebugFields,
reinterpret_cast<void**>(&pfields) );
penumMethodField->Release();
}
}
else if (guidFilter == guidFilterThis )
{
IDebugClassField* pfieldThis = NULL;
hr = pmethod->GetThis( &pfieldThis );
if (SUCCEEDED(hr))
{
CEnumMethodField* penumMethodField =
new CEnumMethodField( pfieldThis, NULL, NULL );
pfieldThis->Release();
if (!penumMethodField)
{
hr = E_OUTOFMEMORY;
}
else
{
hr = penumMethodField->QueryInterface( IID_IEnumDebugFields,
reinterpret_cast<void**>(&pfields) );
penumMethodField->Release();
}
}
}
else
{
hr = E_FAIL;
}
pmethod->Release();
if (hr != S_OK)
return hr;
}
//create a property info enumeration around the field enumerator
CEnumPropertyInfo* pproperties =
new CEnumPropertyInfo( m_provider, m_address, m_binder,
radix, pfields, infoFlags );
if (pfields != NULL)
pfields->Release();
if (pproperties == NULL)
return E_OUTOFMEMORY;
hr = pproperties->QueryInterface( IID_IEnumDebugPropertyInfo2,
reinterpret_cast<void**>(ppchildren) );
pproperties->Release();
return hr;
}