我试图从注册表中读取一些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 Studio2005。也许这是VS中的错误?

几乎忘了-错误代码为2(因为找不到密钥)。

最佳答案

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

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

另外,使用std::vector作为缓冲区会更好-更少的代码,更好的异常安全性,更少的出错率。

关于c++ - RegQueryValueEx不适用于发行版,但可以与Debug一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2872958/

10-11 00:21