RegQueryValueEx不能使用发布版本,但与调试工作正常

问题描述:

我想从注册表中读取一些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(因为找不到密钥)。

您需要初始化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