IDiaLineNumber

Accède aux informations qui décrivent le processus de mappage d’un bloc d’octets de texte d’image à un numéro de ligne de fichier source.

Syntaxe

IDiaLineNumber : IUnknown

Méthodes dans l'ordre Vtable

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

Méthode Description
IDiaLineNumber::get_compiland Récupère une référence au symbole pour le compiland qui a contribué aux octets du texte d’image.
IDiaLineNumber::get_sourceFile Récupère une référence à l’objet de fichier source.
IDiaLineNumber::get_lineNumber Récupère le numéro de ligne dans le fichier source.
IDiaLineNumber::get_lineNumberEnd Récupère le numéro de ligne source basé sur un où se termine l’instruction ou l’expression.
IDiaLineNumber::get_columnNumber Récupère le numéro de colonne où commence l’expression ou l’instruction.
IDiaLineNumber::get_columnNumberEnd Récupère le numéro de colonne où se termine l’expression ou l’instruction.
IDiaLineNumber::get_addressSection Récupère la partie section de l’adresse mémoire où commence un bloc.
IDiaLineNumber::get_addressOffset Récupère la partie décalage de l’adresse mémoire où commence un bloc.
IDiaLineNumber::get_relativeVirtualAddress Récupère l’adresse virtuelle relative (RVA) d’image d’un bloc.
IDiaLineNumber::get_virtualAddress Récupère l’adresse virtuelle (VA) d’un bloc.
IDiaLineNumber::get_length Récupère le nombre d’octets dans un bloc.
IDiaLineNumber::get_sourceFileId Récupère un identificateur de fichier source unique pour le fichier source qui a contribué à cette ligne.
IDiaLineNumber::get_statement Récupère un indicateur spécifiant que ces informations de ligne décrivent le début d’une instruction dans la source du programme.
IDiaLineNumber::get_compilandId Récupère l’identificateur unique du compiland qui a contribué à cette ligne.

Notes

Remarques pour les appelants

Pour obtenir cette interface, appelez les méthodes IDiaEnumLineNumbers::Item ou IDiaEnumLineNumbers::Next.

Exemple

La fonction suivante affiche les numéros de ligne utilisés dans une fonction (représentée par pSymbol).

void dumpFunctionLines( IDiaSymbol* pSymbol, IDiaSession* pSession )
{
    ULONGLONG length = 0;
    DWORD     isect  = 0;
    DWORD     offset = 0;

    pSymbol->get_addressSection( &isect );
    pSymbol->get_addressOffset( &offset );
    pSymbol->get_length( &length );
    if ( isect != 0 && length > 0 )
    {
        CComPtr< IDiaEnumLineNumbers > pLines;
        if ( SUCCEEDED( pSession->findLinesByAddr(
                                      isect,
                                      offset,
                                      static_cast<DWORD>( length ),
                                      &pLines)
                      )
           )
        {
            CComPtr< IDiaLineNumber > pLine;
            DWORD celt      = 0;
            bool  firstLine = true;

            while ( SUCCEEDED( pLines->Next( 1, &pLine, &celt ) ) &&
                    celt == 1 )
            {
                DWORD offset;
                DWORD seg;
                DWORD linenum;
                CComPtr< IDiaSymbol >     pComp;
                CComPtr< IDiaSourceFile > pSrc;

                pLine->get_compiland( &pComp );
                pLine->get_sourceFile( &pSrc );
                pLine->get_addressSection( &seg );
                pLine->get_addressOffset( &offset );
                pLine->get_lineNumber( &linenum );
                printf( "\tline %d at 0x%x:0x%x\n", linenum, seg, offset );
                pLine = NULL;
                if ( firstLine )
                {
                    // sanity check
                    CComPtr< IDiaEnumLineNumbers > pLinesByLineNum;
                    if ( SUCCEEDED( pSession->findLinesByLinenum(
                                                  pComp,
                                                  pSrc,
                                                  linenum,
                                                  0,
                                                  &pLinesByLineNum)
                                  )
                       )
                    {
                        CComPtr< IDiaLineNumber > pLine;
                        DWORD celt;
                        while ( SUCCEEDED( pLinesByLineNum->Next( 1, &pLine, &celt ) ) &&
                                celt == 1 )
                        {
                            DWORD offset;
                            DWORD seg;
                            DWORD linenum;

                            pLine->get_addressSection( &seg );
                            pLine->get_addressOffset( &offset );
                            pLine->get_lineNumber( &linenum );
                            printf( "\t\tfound line %d at 0x%x:0x%x\n", linenum, seg, offset );
                            pLine = NULL;
                        }
                    }
                    firstLine = false;
                }
            }
        }
    }
}

Configuration requise

En-tête : Dia2.h

Bibliothèque : diaguids.lib

DLL : msdia80.dll

Voir aussi