我试图从注册表中读取一些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/