Hizkuntza
Oharra
Baimena behar duzu orria atzitzeko. Direktorioetan saioa has dezakezu edo haiek alda ditzakezu.
Baimena behar duzu orria atzitzeko. Direktorioak alda ditzakezu.
Recupera las clases con el atributo especificado que se implementan en el lenguaje de programación especificado.
Sintaxis
int GetAttributedClassesForLanguage (
Guid guidLanguage,
string pstrAttribute,
out IEnumDebugFields ppEnum
);
Parámetros
guidLanguage
[in] Identificador único del idioma.
pstrAttribute
[in] Cadena de atributo.
ppEnum
[out] Devuelve una enumeración de las clases de atributo.
Valor devuelto
Si la operación se realiza correctamente, devuelve S_OK; de lo contrario, devuelve un código de error.
Ejemplo
En el ejemplo siguiente se muestra cómo implementar este método para un objeto CDebugSymbolProvider que expone la interfaz IDebugComPlusSymbolProvider .
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;
}