IDiaLineNumber
イメージ テキストのバイト ブロックをソース ファイルの行番号にマップするプロセスを記述する情報にアクセスします。
構文
IDiaLineNumber : IUnknown
Vtable 順序のメソッド
次の表に、IDiaLineNumber
のメソッドを示します。
メソッド | 説明 |
---|---|
IDiaLineNumber::get_compiland | イメージ テキストのバイトをコントリビュートしたコンパイル単位のシンボルへの参照を取得します。 |
IDiaLineNumber::get_sourceFile | ソース ファイル オブジェクトへの参照を取得します。 |
IDiaLineNumber::get_lineNumber | ソース ファイル内の行番号を取得します。 |
IDiaLineNumber::get_lineNumberEnd | ステートメントまたは式の終了位置を示す、1 から始まるソース行番号を取得します。 |
IDiaLineNumber::get_columnNumber | 式またはステートメントの開始位置を示す列番号を取得します。 |
IDiaLineNumber::get_columnNumberEnd | 式またはステートメントの終了位置を示す列番号を取得します。 |
IDiaLineNumber::get_addressSection | ブロックが開始されるメモリ アドレスのセクション部分を取得します。 |
IDiaLineNumber::get_addressOffset | ブロックが開始されるメモリ アドレスのオフセット部分を取得します。 |
IDiaLineNumber::get_relativeVirtualAddress | ブロックのイメージ相対仮想アドレス (RVA) を取得します。 |
IDiaLineNumber::get_virtualAddress | ブロックの仮想アドレス (VA) を取得します。 |
IDiaLineNumber::get_length | ブロック内のバイトの数を取得します。 |
IDiaLineNumber::get_sourceFileId | この行をコントリビュートしたソース ファイルの一意のソース ファイル識別子を取得します。 |
IDiaLineNumber::get_statement | プログラム ソースで、ステートメントの先頭がこの行情報に記述されることを示すフラグを取得します。 |
IDiaLineNumber::get_compilandId | この行をコントリビュートしたコンパイル単位の一意識別子を取得します。 |
解説
呼び出し元に関する注意事項
このインターフェイスを取得するには、IDiaEnumLineNumbers::Item または IDiaEnumLineNumbers::Next メソッドを呼び出します。
例
次の関数は、(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;
}
}
}
}
}
要件
ヘッダー: Dia2.h
ライブラリ: diaguids.lib
DLL: msdia80.dll