IDebugComPlusSymbolProvider::GetAttributedClassesForLanguageIDebugComPlusSymbolProvider::GetAttributedClassesForLanguage

Recupera las clases con el atributo especificado que se implementan en el lenguaje de programación especificado.Retrieves the classes with the specified attribute that are implemented in the specified programming language.

SintaxisSyntax

[C++]  
HRESULT GetAttributedClassesForLanguage (  
   GUID               guidLanguage,  
   LPOLESTR           pstrAttribute,  
   IEnumDebugFields** ppEnum  
);  
[C#]  
int GetAttributedClassesForLanguage (  
   Guid                 guidLanguage,  
   string               pstrAttribute,  
   out IEnumDebugFields ppEnum  
);  

ParámetrosParameters

guidLanguage
[in] Identificador único para el idioma.[in] Unique identifier for the language.

pstrAttribute
[in] La cadena del atributo.[in] The attribute string.

ppEnum
[out] Devuelve una enumeración de las clases de atributos.[out] Returns an enumeration of the attribute classes.

Valor devueltoReturn Value

Si se realiza correctamente, devuelve S_OK; en caso contrario, devuelve un código de error.If successful, returns S_OK; otherwise, returns an error code.

EjemploExample

En el ejemplo siguiente se muestra cómo implementar este método para un CDebugSymbolProvider objeto que expone la IDebugComPlusSymbolProvider interfaz.The following example shows how to implement this method for a CDebugSymbolProvider object that exposes the IDebugComPlusSymbolProvider interface.

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 implemeted 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;  
}  

Vea tambiénSee Also

IDebugComPlusSymbolProviderIDebugComPlusSymbolProvider