1
我想從註冊表中讀取一些ODBC細節,併爲此使用RegQueryValueEx。問題是,當我編譯發行版時,它根本無法讀取任何註冊表值。RegQueryValueEx不能使用發佈版本,但與調試工作正常
的代碼是:
CString odbcFuns::getOpenedKeyRegValue(HKEY hKey, CString valName)
{
CString retStr;
char *strTmp = (char*)malloc(MAX_DSN_STR_LENGTH * sizeof(char));
memset(strTmp, 0, MAX_DSN_STR_LENGTH);
DWORD cbData;
long rret = RegQueryValueEx(hKey, valName, NULL, NULL, (LPBYTE)strTmp, &cbData);
if (rret != ERROR_SUCCESS)
{
free(strTmp);
return CString("?");
}
strTmp[cbData] = '\0';
retStr.Format(_T("%s"), strTmp);
free(strTmp);
return retStr;
}
我已經找到了解決方法這一點 - 我禁用優化(/ OD),但它似乎很奇怪,我需要做的。有沒有其他的方法?我使用Visual Studio 2005.也許這是VS中的錯誤?
差不多忘了 - 錯誤代碼是2(因爲找不到密鑰)。
是的。在Debug版本中,該值將被初始化爲0xcccccccc。不要減1.使用CRegKey類來避免這些陷阱。 – 2010-05-20 12:11:55
@Hans Passant他有N個字符的緩衝區,填充零。如果他不減1,並且函數填充所有N個字符,則該字符串不再以空終止。 – sharptooth 2010-05-20 12:20:26
檢查SDK文檔:*如果數據具有REG_SZ,REG_MULTI_SZ或REG_EXPAND_SZ類型,則該大小包括任何終止的空字符或字符,除非數據存儲在沒有它們的地方* – 2010-05-20 12:28:44