Google Drive 文件夹的路径可以在文件中找到,该文件...\AppData\Local\Google\Drive\sync_config.db
是一个 SQLITE3 数据库。我的 Windows C++ 程序曾经成功地获取此数据,但最近它停止工作,无论是在我的 PC 上还是对于我听说过的客户。数据库必须仍然有效,因为我可以使用sqlite3
命令行实用程序打开数据库并使用我尝试以编程方式使用的确切查询成功查询它。
如下所示的代码中发生的事情是它永远不会过去**sqlite3_prepare_v2**
,它会返回错误代码26
。此代码通常表明该文件不是有效的数据库。那么为什么命令行实用程序有效呢?
有什么想法可能会突然破坏这段代码吗?
extern CString GoogleDrivePath()
{
CString sPath = "";
CString sDbPath;
char acValue[1024];
DWORD lSize = sizeof(acValue);
struct _stat fstat;
sqlite3 *pDb;
sqlite3_stmt *pStmt;
int iSts;
char acSelect[] = "SELECT data_value FROM data WHERE entry_key = 'local_sync_root_path';";
const unsigned char *pPath;
DWORD lLen = GetEnvironmentVariable("LOCALAPPDATA", acValue, lSize);
if (lSize <= 0) return(sPath);
sDbPath = acValue;
sDbPath += "\\Google\\Drive\\sync_config.db";
if (_stat(sDbPath, &fstat) < 0) return(sPath);
iSts = sqlite3_open_v2(sDbPath, &pDb, SQLITE_OPEN_READONLY, NULL);
if (iSts) return(sPath);
iSts = sqlite3_prepare_v2(pDb, acSelect, -1, &pStmt, NULL);
if (!iSts) {
iSts = sqlite3_step(pStmt);
if (iSts == SQLITE_ROW) {
pPath = sqlite3_column_text(pStmt, 0);
if (pPath != NULL) {
sPath = pPath;
}
}
sqlite3_finalize(pStmt);
}
sqlite3_close(pDb);
return(sPath);
}