1

我正在解析ESE 数据库文件,即WebCacheV01.dat。这是 IE 10 开始存储所有浏览历史记录和其他信息的文件。我正在使用 JET Blue CPP api 来解析这个文件。

我可以读取整数或长整数类型的任何列值,但无法读取字符串类型的列值。

例如,我打开了“MSysObjects”表并想要检索“Name”列的值。

这是示例代码

 for( err = ::JetMove( sessionID, tableId, JET_MoveFirst, 0 );
        JET_errSuccess == err;
        err = ::JetMove( sessionID, tableId, JET_MoveNext, 0 ) )
    {
        JET_COLUMNID columnid = 12/*columnid of the Name column*/;
        char *pszBuff = new char[2048];
        if( pszBuff )
        {
            long lReadBytes;
             memset(pszBuff, 0, 2048);
             err = ::JetRetrieveColumn( sessionID,
               tableId,
                columnid,
                pszBuff,
                2047,
               &lReadBytes,
               0,
               NULL);
            delete[] pszBuff;
        }
    }

JetRetrieveColumn 的返回值为 -1507,它不过是 JET_errColumnNotFound。我已经使用 ESEDatabaseViewer 工具验证了 MSysObjects 表包含 25 列。这意味着列 18 不是无效的。

如果有人知道如何从 ESE 数据库中检索字符串值,请告诉我。

提前谢谢你。

4

1 回答 1

2

花了将近两天的时间,我终于弄清楚了如何从 ESE 数据库表中正确读取值。我在想 columnid 是按顺序排列的,因此我通过计算“ESEDatabaseView”工具中的特定列位置来确定 columnid。

但事实并非如此。获取 columnid 的正确方法是通过指定列的名称来调用 JetGetTableColumnInfo 方法。获取 columnid 后,在 JetRetrieveColumn 方法中使用它来检索列值。

这是更正后的代码

for( err = ::JetMove( jetSessionId, jetContainersTableId, JET_MoveFirst, 0 );
    JET_errSuccess == err;
    err = ::JetMove( jetSessionId, jetContainersTableId, JET_MoveNext, 0 ) )
{
    unsigned long nReadBytes = 0;

    JET_COLUMNDEF colName;
    err = ::JetGetTableColumnInfoW(jetSessionId, jetContainersTableId, L"Name", (void *)&colName, sizeof(JET_COLUMNDEF), JET_ColInfo);

    wchar_t szName[MAX_PATH] = {0};
    if( JET_errSuccess == err )
    {
        err = ::JetRetrieveColumn(jetSessionId, jetContainersTableId, colName.columnid, szName, sizeof(szName) , &nReadBytes, 0, NULL);
    }
}

这可能对正在处理 ESE 数据库的人有所帮助。

于 2015-02-18T10:31:02.410 回答