IDiaSession::findLinesByLinenum

确定源文件中指定行号所在的或附近的编译单位的行号。

语法

HRESULT findLinesByLinenum ( 
    IDiaSymbol*           compiland,
    IDiaSourceFile*       file,
    DWORD                 linenum,
    DWORD                 column,
    IDiaEnumLineNumbers** ppResult
);

参数

compiland

[in] 一个 IDiaSymbol 对象,表示要在其中搜索行号的编译单位。 此参数不能为 NULL

file

[in] 一个 IDiaSourceFile 对象,表示要在其中搜索的源文件。 此参数不能为 NULL

linenum

[in] 指定一个从 1 开始的行号。

注意

不能使用零指定所有行(使用 IDiaSession::findLines 方法查找所有行)。

column

[in] 指定列号。 使用零指定所有列。 一列是偏移到一行的一个字节。

ppResult

[out] 返回一个 IDiaEnumLineNumbers 对象,该对象包含检索到的行号的列表。

返回值

如果成功,则返回 S_OK;否则,返回错误代码。

示例

下面的示例展示了如何打开源文件、枚举此文件贡献的编译单位,以及在源文件中找到每个编译单位开始的行号。

void ShowLinesInCompilands(IDiaSession *pSession, LPCOLESTR filename)
{
    IDiaEnumSourceFiles* pEnum;
    IDiaSourceFile*      pFile;
    DWORD                celt;

    pSession->findFile ( NULL, filename, nsFNameExt, &pEnum );
    while ( pEnum->Next ( 1, &pFile, &celt ) == S_OK ) // for each file
    {
        IDiaEnumSymbols* pEnumCompilands;
        IDiaSymbol* pCompiland;

        pFile->get_compilands ( &pEnumCompilands );
        // for each compiland
        while ( pEnumCompilands->Next ( 1, &pCompiland, &celt ) == S_OK )
        {
            IDiaEnumLineNumbers* pEnum;
            // Find first compiland closest to line 1 of the file.
            if (pSession->findLinesByLinenum( pCompiland, pFile, 1, 0, &pEnum ) == S_OK)
            {
                IDiaLineNumber *pLineNumber;
                DWORD lineCount;
                while ( pEnum->Next(1,&pLineNumber,&lineCount) == S_OK)
                {
                    DWORD lineNum;
                    if (pLineNumber->get_line(&lineNum) == S_OK)
                    {
                        printf("compiland starts in source at line number = %lu\n",lineNum);
                    }
                }
            }
        }
    }
}

另请参阅