碰到一个微软的bug:CWinAppEx::GetString
2024-08-29 20:44:53
在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了MFC框架所以,为了简化代码直接使用了CWinAppEx::GetString 、CWinAppEx::SetString、CWinAppEx::GetInt、CWinAppEx::SetInt等等框架内函数,因为使用它之间只需要SetRegistryKey(_T("Application Name"));设置一下就好了,远比自己调用win32 API或者CRegKey类用起来方便多了。
发现一个GetString的在实现的时候有一个bug,起初是我在读取一个注册表String时发现,CWinAppEx::GetString即使传入了第二个参数lpzDefault没能成功访问注册表的话返回还是空字符串!
debug进入代码中看:
首先可以发现GetString实际上是调用的GetSectionString函数:
CString CWinAppEx::GetString(LPCTSTR lpszEntry, LPCTSTR lpszDefault /*= ""*/)
{
return GetSectionString(_T(""), lpszEntry, lpszDefault);
}
afxwinappex.cpp:
CString CWinAppEx::GetSectionString( LPCTSTR lpszSubSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault /*= ""*/)
{
ENSURE(lpszSubSection != NULL);
ENSURE(lpszEntry != NULL);
ENSURE(lpszDefault != NULL); CString strRet = lpszDefault; CString strSection = GetRegSectionPath(lpszSubSection); CSettingsStoreSP regSP;
CSettingsStore& reg = regSP.Create(FALSE, TRUE); if (reg.Open(strSection))
{
reg.Read(lpszEntry, strRet);
}
return strRet;
}
从代码中来看,前面几行都没有问题,按F11进入到reg.Read(lpszEntry, strRet);
afxsettingsstore.cpp:
BOOL CSettingsStore::Read(LPCTSTR lpszValueName, CString& strValue)
{
ENSURE(lpszValueName != NULL); strValue.Empty(); DWORD dwCount = ;
if (m_reg.QueryStringValue(lpszValueName, NULL, &dwCount) != ERROR_SUCCESS)
{
return FALSE;
} if (dwCount == )
{
return TRUE;
} LPTSTR szValue = new TCHAR [dwCount + ]; BOOL bRes = m_reg.QueryStringValue(lpszValueName, szValue, &dwCount) == ERROR_SUCCESS;
if (bRes)
{
strValue = szValue;
} delete [] szValue;
return bRes;
}
在这里可以看到strValue.Empty();在最开始的时候就被调用了,明显不对,就算你是否有正确的值传进来,也不该首先就直接将default value清空啊,坑啊!
搜索看到国外有个哥们也遇到相同的问题:http://www.bcgsoft.com/cgi-bin/forum/topic.asp?TOPIC_ID=4485
最新文章
- android对话框的EditText点击后不显示输入法的问题
- Theano: CNMeM is disabled, CuDNN not available
- .Net和C#的理解
- Warp divergence
- C 宏定义 理解(1)
- 初次使用InstallShield笔记
- [Effective JavaScript笔记]第1条:了解使用的js版本
- ELK之nginx日志分析图表创建
- druid配置(转)
- spring mvc DispatcherServlet详解之一---处理请求深入解析
- python代码中pass的用法
- 使用sql语句创建表、修改表、添加列等
- 系统变量file.encoding对Java的运行影响有多大?(转)good
- Objective C多态
- LeetCode 26. Remove Duplicates from Sorted Array (从有序序列里移除重复项)
- UE4中创建第一、第三人称角色,并进行角色间的切换
- leetcode240
- CSS3 animation动画,循环间的延时执行时间
- Qt打包成单独可执行的exe文件
- php创建桌面快捷方式实现方法