我正在尝试从注册表中读取一些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(因为找不到密钥)。
答案 0 :(得分:4)
您需要初始化cbData
- 在致电MAX_DSN_STR_LENGTH - 1
之前将其设为RegQueryValueEx()
。
问题可能与配置有关,因为变量在一个配置中由编译器初始化,而在另一个配置中未初始化。
此外,您可以更好地使用std::vector
缓冲区 - 更少的代码,更好的异常安全性,更少的错误。