IDebugComPlusSymbolProvider::GetAttributedClassesForLanguage
检索具有指定编程语言中实现的指定属性的类。
语法
int GetAttributedClassesForLanguage (
Guid guidLanguage,
string pstrAttribute,
out IEnumDebugFields ppEnum
);
参数
guidLanguage
[in]语言的唯一标识符。
pstrAttribute
[in]属性字符串。
ppEnum
[out]返回特性类的枚举。
返回值
如果成功,则返回 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;
}