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
为无缓冲的代码,更好的异常安全性,更少的错误倾向。
是的。在Debug版本中,该值将被初始化为0xcccccccc。不要减1.使用CRegKey类来避免这些陷阱。 – 2010-05-20 12:11:55
@Hans Passant他有N个字符的缓冲区,填充零。如果他不减1,并且函数填充所有N个字符,则该字符串不再以空终止。 – sharptooth 2010-05-20 12:20:26
检查SDK文档:*如果数据具有REG_SZ,REG_MULTI_SZ或REG_EXPAND_SZ类型,则该大小包括任何终止的空字符或字符,除非数据存储在没有它们的地方* – 2010-05-20 12:28:44