在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了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

最新文章

  1. android对话框的EditText点击后不显示输入法的问题
  2. Theano: CNMeM is disabled, CuDNN not available
  3. .Net和C#的理解
  4. Warp divergence
  5. C 宏定义 理解(1)
  6. 初次使用InstallShield笔记
  7. [Effective JavaScript笔记]第1条:了解使用的js版本
  8. ELK之nginx日志分析图表创建
  9. druid配置(转)
  10. spring mvc DispatcherServlet详解之一---处理请求深入解析
  11. python代码中pass的用法
  12. 使用sql语句创建表、修改表、添加列等
  13. 系统变量file.encoding对Java的运行影响有多大?(转)good
  14. Objective C多态
  15. LeetCode 26. Remove Duplicates from Sorted Array (从有序序列里移除重复项)
  16. UE4中创建第一、第三人称角色,并进行角色间的切换
  17. leetcode240
  18. CSS3 animation动画,循环间的延时执行时间
  19. Qt打包成单独可执行的exe文件
  20. php创建桌面快捷方式实现方法

热门文章

  1. docker私有仓库的搭建
  2. vue -- 正确的引入jquery
  3. PAT1098【插入排序+堆排序】
  4. centos lamp 配置
  5. 5.Python初窥门径(字典)
  6. Shell面试,笔试整理
  7. js 为对象添加和删除属性
  8. 4、kvm相关网卡操作(添加、删除)
  9. Django 04 模板标签(if、for、url、with、autoeacape、模板继承于引用、静态文件加载)
  10. 分析师分析业务维度,(个人制作分析思维导图Xmind)