RegQueryValueEx不使用Release版本,但在Debug中运行良好

时间:2010-05-20 10:44:14

标签: c++ visual-studio-2005 registry

我正在尝试从注册表中读取一些ODBC详细信息,为此我使用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(因为找不到密钥)。

1 个答案:

答案 0 :(得分:4)

您需要初始化cbData - 在致电MAX_DSN_STR_LENGTH - 1之前将其设为RegQueryValueEx()

问题可能与配置有关,因为变量在一个配置中由编译器初始化,而在另一个配置中未初始化。

此外,您可以更好地使用std::vector缓冲区 - 更少的代码,更好的异常安全性,更少的错误。