IDebugComPlusSymbolProvider::GetAttributedClassesForLanguage
지정된 프로그래밍 언어로 구현된 지정된 특성을 가진 클래스를 검색합니다.
구문
int GetAttributedClassesForLanguage (
Guid guidLanguage,
string pstrAttribute,
out IEnumDebugFields ppEnum
);
매개 변수
guidLanguage
[in] 언어의 고유 식별자입니다.
pstrAttribute
[in] 특성 문자열입니다.
ppEnum
[out] 특성 클래스의 열거형을 반환합니다.
Return Value
성공하면 S_OK
를 반환하고, 실패하면 오류 코드를 반환합니다.
예시
다음 예제에서는 IDebugComPlusSymbolProvider 인터페이스를 노출하는 CDebugSymbolProvider 개체에 대해 이 메서드를 구현하는 방법을 보여 줍니다.
HRESULT CDebugSymbolProvider::GetAttributedClassesForLanguage(
GUID guidLanguage,
__in_z LPOLESTR pstrAttribute,
IEnumDebugFields** ppEnum
)
{
HRESULT hr = S_OK;
CFieldList listFields;
CModIter ModIter;
CModule* pModule; // the iterator owns the reference
ULONG cClasses = 0;
DWORD iTypeDef = 0;
mdTypeDef* rgTypeDefs = NULL;
IDebugField** rgFields = NULL;
DWORD ctField = 0;
CEnumDebugFields* pEnumFields = NULL;
ASSERT(IsValidObjectPtr(this, CDebugSymbolProvider));
ASSERT(IsValidWritePtr(ppEnum, IEnumDebugFields*));
METHOD_ENTRY( CDebugSymbolProvider::GetAttributedClassesForLanguage );
IfFalseGo( ppEnum, E_INVALIDARG );
*ppEnum = NULL;
// For Each Module - call EnumFields
IfFailGo( GetModuleIter(&ModIter) );
// Find the Max number of classes
while (ModIter.GetNext(&pModule))
{
CComPtr<IMetaDataImport> pMetaData;
HCORENUM hEnum = 0;
ULONG cTypeDefs;
ULONG cEnum;
pModule->GetMetaData( &pMetaData );
IfFailGo( pMetaData->EnumTypeDefs( &hEnum,
NULL,
0,
&cTypeDefs ) );
IfFailGo( pMetaData->CountEnum( hEnum, &cEnum ) );
cClasses += cEnum;
}
IfNullGo( rgTypeDefs = new mdTypeDef[cClasses], E_OUTOFMEMORY );
IfNullGo( rgFields = new IDebugField * [cClasses], E_OUTOFMEMORY );
ModIter.Reset();
// Create the classes
while (ModIter.GetNext(&pModule))
{
CComPtr<IMetaDataImport> pMetaData;
HCORENUM hEnum = 0;
ULONG cTypeDefs;
ULONG cEnum;
const void* pUnused;
ULONG cbUnused;
pModule->GetMetaData( &pMetaData );
IfFailGo( pMetaData->EnumTypeDefs( &hEnum,
NULL,
0,
&cTypeDefs ) );
IfFailGo( pMetaData->CountEnum( hEnum, &cEnum ) );
IfFailGo( pMetaData->EnumTypeDefs( &hEnum,
rgTypeDefs,
cEnum,
&cTypeDefs ) );
pMetaData->CloseEnum(hEnum);
hEnum = NULL;
for ( iTypeDef = 0; iTypeDef < cTypeDefs; iTypeDef++)
{
if (pMetaData->GetCustomAttributeByName( rgTypeDefs[iTypeDef],
pstrAttribute,
&pUnused,
&cbUnused ) == S_OK)
{
// Only return classes implemented in the correct language
if (pModule->ClassImplementedInLanguage( rgTypeDefs[iTypeDef],
guidLanguage) )
{
if (CreateClassType( pModule->GetID(),
rgTypeDefs[iTypeDef],
rgFields + ctField) == S_OK)
{
ctField++;
}
else
{
ASSERT(!"Failed to Create Attributed Class");
}
}
}
}
}
IfNullGo( pEnumFields = new CEnumDebugFields, E_OUTOFMEMORY );
IfFailGo( pEnumFields->Initialize(rgFields, ctField) );
IfFailGo( pEnumFields->QueryInterface( __uuidof(IEnumDebugFields),
(void**) ppEnum ) );
Error:
METHOD_EXIT( CDebugSymbolProvider::GetAttributedClassesForLanguage, hr );
DELETERG( rgTypeDefs );
for ( iTypeDef = 0; iTypeDef < ctField; iTypeDef++)
{
RELEASE( rgFields[iTypeDef] );
}
DELETERG( rgFields );
RELEASE( pEnumFields );
return hr;
}