2010-05-20 52 views
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(因爲找不到密鑰)。

回答

3

您需要初始化cbData - 將其設置爲MAX_DSN_STR_LENGTH - 1,然後致電RegQueryValueEx()

該問題可能與配置有關,因爲該變量是由編譯器在一個配置中初始化的,而在另一個配置中未初始化。

此外,你會更好地使用std::vector爲無緩衝的代碼,更好的異常安全性,更少的錯誤傾向。

+0

是的。在Debug版本中,該值將被初始化爲0xcccccccc。不要減1.使用CRegKey類來避免這些陷阱。 – 2010-05-20 12:11:55

+0

@Hans Passant他有N個字符的緩衝區,填充零。如果他不減1,並且函數填充所有N個字符,則該字符串不再以空終止。 – sharptooth 2010-05-20 12:20:26

+0

檢查SDK文檔:*如果數據具有REG_SZ,REG_MULTI_SZ或REG_EXPAND_SZ類型,則該大小包括任何終止的空字符或字符,除非數據存儲在沒有它們的地方* – 2010-05-20 12:28:44

相關問題