Partager via


IDiaSegment

Mappe les données du numéro de section à des segments d’espace d’adressage.

Syntax

IDiaSegment : IUnknown

Méthodes dans l'ordre Vtable

Le tableau suivant présente les méthodes de IDiaSegment.

Méthode Description
IDiaSegment::get_frame Récupère le numéro de segment.
IDiaSegment::get_offset Récupère le décalage, en segments, où commence la section.
IDiaSegment::get_length Récupère le nombre d’octets dans le segment.
IDiaSegment::get_read Récupère un indicateur qui spécifie si le segment peut être lu.
IDiaSegment::get_write Récupère un indicateur qui spécifie si le segment peut être modifié.
IDiaSegment::get_execute Récupère un indicateur qui spécifie si le segment est exécutable.
IDiaSegment::get_addressSection Récupère le numéro de section mappé à ce segment.
IDiaSegment::get_relativeVirtualAddress Récupère l’adresse virtuelle relative (RVA) du début de la section.
IDiaSegment::get_virtualAddress Récupère l’adresse virtuelle (VA) du début de la section.

Notes

Étant donné que le SDK Dia (Debug Interface Access) effectue déjà des traductions du décalage de section vers des adresses virtuelles relatives, la plupart des applications n’utilisent pas les informations de la carte de segments.

Remarques pour les appelants

Obtenez cette interface en appelant les méthodes IDiaEnumSegments::Item ou IDiaEnumSegments::Next. Pour plus de détails, voir les exemples.

Exemple

Cette fonction affiche l’adresse de tous les segments d’une table et le symbole le plus proche.

void ShowSegments(IDiaTable *pTable, IDiaSession *pSession)
{
    CComPtr<IDiaEnumSegments> pSegments;
    if ( SUCCEEDED( pTable->QueryInterface(
                                _uuidof( IDiaEnumSegments ),
                               (void**)&pSegments )
                  )
       )
    {
        CComPtr<IDiaSegment> pSegment;
        while ( SUCCEEDED( hr = pSegments->Next( 1, &pSegment, &celt ) ) &&
                celt == 1 )
        {
            DWORD rva;
            DWORD seg;

            pSegment->get_addressSection( &seg );
            if ( pSegment->get_relativeVirtualAddress( &rva ) == S_OK )
            {
                printf( "Segment %i addr: 0x%.8X\n", seg, rva );
                pSegment = NULL;

                CComPtr<IDiaSymbol> pSym;
                if ( psession->findSymbolByRVA( rva, SymTagNull, &pSym ) == S_OK )
                {
                    CDiaBSTR name;
                    DWORD    tag;

                    pSym->get_symTag( &tag );
                    pSym->get_name( &name );
                    printf( "\tClosest symbol: %ws (%ws)\n",
                            name != NULL ? name : L"",
                            szTags[ tag ] );
                }
            }
        }
    }
}

Configuration requise

En-tête : Dia2.h

Bibliothèque : diaguids.lib

DLL : msdia80.dll

Voir aussi