Поделиться через


IDiaSegment

Сопоставляет данные из номера раздела с сегментами адресного пространства.

Синтаксис

IDiaSegment : IUnknown

Методы в порядке таблицы Vtable

В следующей таблице показаны методы IDiaSegment.

Метод Description
IDiaSegment::get_frame Извлекает номер сегмента.
IDiaSegment::get_offset Извлекает смещение в сегментах, где начинается раздел.
IDiaSegment::get_length Извлекает количество байтов в сегменте.
IDiaSegment::get_read Извлекает флаг, указывающий, можно ли считывать сегмент.
IDiaSegment::get_write Извлекает флаг, указывающий, можно ли изменить сегмент.
IDiaSegment::get_execute Извлекает флаг, указывающий, является ли сегмент исполняемым.
IDiaSegment::get_addressSection Извлекает номер раздела, сопоставленный с этим сегментом.
IDiaSegment::get_relativeVirtualAddress Извлекает относительный виртуальный адрес (RVA) начала раздела.
IDiaSegment::get_virtualAddress Извлекает виртуальный адрес (VA) начала раздела.

Замечания

Так как пакет SDK для доступа к интерфейсу отладки (DIA) уже выполняет переводы из смещения раздела на относительные виртуальные адреса, большинство приложений не будут использовать сведения на карте сегментов.

Заметки для вызывающих абонентов

Получите этот интерфейс, вызвав методы IDiaEnumSegments::Item или IDiaEnumSegments::Next . Этот вариант подробно представлен в примере.

Пример

Эта функция отображает адрес всех сегментов таблицы и ближайшего символа.

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 ] );
                }
            }
        }
    }
}

Требования

Заголовок: Dia2.h

Библиотека: diaguids.lib

DLL: msdia80.dll

См. также