我正在解析ESE数据库文件,即WebCacheV01.dat。这是IE 10开始存储所有浏览历史记录和其他信息的文件。我正在使用JET Blue CPP apis来解析这个文件。
我可以读取integer或long类型的任何列值,但不能读取string类型的列值。
例如我打开了" 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列。这意味着columnd 18无效。
如果有人知道如何从ESE数据库中检索字符串值,请告诉我。
提前感谢你。
答案 0 :(得分: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数据库的人。