在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了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 = 0;if (m_reg.QueryStringValue(lpszValueName, NULL, &dwCount) != ERROR_SUCCESS){return FALSE;}if (dwCount == 0){return TRUE;}LPTSTR szValue = new TCHAR [dwCount + 1];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

转载于:https://www.cnblogs.com/hyb1/p/3242949.html

碰到一个微软的bug:CWinAppEx::GetString相关推荐

  1. 解决xib自定义tableFooterView一个神奇的bug

    最近看视频学习,做一个demo的时候碰到一个神奇的bug,后来经过各种搜索.调试和修改代码虽然把这个bug解决了,但不知道为什么.这里打算把这个过程分享出来,给大家做参考顺便也求大神来指导下. 事情是 ...

  2. 一个 P4 的 Bug,就难倒了 JDK 吗 ?

    作者 | 码农唐磊 来源 | 程序猿石头(ID:tangleithu) 背景 分享一下之前踩的一个坑,背景是这样的: 我们的项目依赖于一个外部服务,该外部服务提供 REST 接口供我方调用,这是很常见 ...

  3. 一个GDIPlus的Bug -- OutofMemory异常

    今天发现 framework2.0中的一个GDIPlus的Bug: 在Form的OnPaint事件里面写如下代码: private void Form1_Paint(object sender, Pa ...

  4. AI一分钟|阿里云解释故障原因:触发了一个未知代码Bug;清华蝉联ISC18超算竞赛总冠军...

     ▌阿里云发说明解释昨日故障原因:触发了一个未知代码Bug 今日凌晨,阿里云官方微博针对昨日出现的大规模故障问题作出官方回应.声明称,在运维上的一个操作失误,导致一些客户访问阿里云官网控制台和使用 ...

  5. 珍惜鼠标,慎用双击。maxthon浏览器的双击功能毁了我一个微软鼠标一个罗技鼠标,伤心...

    maxthon浏览器的双击关闭Tab的功能确实很方便.   但是没有想到用了一段时间之后,我的鼠标给毁了,一个微软鼠标一个罗技鼠标(几个在家里,一个在公司),双双出现这样的症状:单击识别成双击:按住左 ...

  6. Google是否会成为下一个微软?

    在4月底,JP摩根邀请我参加一个"思想领导者聚餐"来讨论最近硅谷和数字媒体的事情.在旧金山Kokkari饭馆的私人包间里坐了有20来人,有来自著名VP公司.成功企业家和JP摩根的一 ...

  7. IOS7的一个神奇的Bug

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处 今天跟龙强兄,没事在得瑟手机,结果无意中发现一个IOS7的bug,如果iphone未设置锁屏密码,但是分别设置 ...

  8. 给JDK报了一个P4的Bug,结果居然……

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 作者:程序猿石头/码农唐磊( ...

  9. 使用SAP WebIDE进行一个典型的bug修复流程

    假设我们发现一个产品的bug需要修复,一般我们不会直接在master分支上做修改,而是专门新建一个供bug fix使用的分支,比如m1分支,测试提交后,再merge到master branch上. 下 ...

最新文章

  1. 大赛季(2020)新一代信息技术行业赛赛事公告
  2. git 恢复被覆盖本地提交内容
  3. 《Android 应用案例开发大全(第二版)》——导读
  4. 一个学妹写的按键检测函数把我秀翻了!
  5. 14、高可用keepalived搭建及切换
  6. (配置消息转换器) sso单点登入之jsonp改进版
  7. gps测量与数据处理第三版pdf_测量培训需要掌握哪些知识点呢?_东英时代何老师...
  8. ping网络诊断常见故障
  9. 浏览器打开就是360导航(浏览器被360劫持)
  10. 计算机产品校园营销方案,惠普笔记本电脑校园营销策划方案.doc
  11. 求95859回文数c语言程序,csdn 回文数
  12. Unirech腾讯云代充-云服务器登陆及远程连接常见问题
  13. Smart Construction:工程机械正在加速进入智能建设时代
  14. php账单明细功能怎么实现,php 处理微信账单
  15. 【BZOJ 1233】 干草堆
  16. java五子棋AI算法人机对战(春物彩羽版可下载试玩PC端)
  17. .NET iTextSharp PDF添加文字水印
  18. 详解super()函数
  19. 施乐服务器怎么显示浏览器,怎么才能显示出电脑IE浏览器的菜单栏和工具栏
  20. 华为 H3C 配置 Portal认证 mac-trigger快速认证 Mac无感知认证 Radius认证计费 对接 外部Portal认证计费系统 案例

热门文章

  1. 因为银行过度授信导致信用卡逾期还不上,可以拒绝还款吗?
  2. TESTb需要向至少十几家应用商店提交上线审核,且每个应用商店要求的资料可能都不一样,异常繁琐
  3. 成吉思汗的子孙:中国游牧蒙古人
  4. Power of Three
  5. iphone怎样关闭副屏_iPhone手机关掉这3个设置,不仅省电,而且手机还不会卡
  6. umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
  7. requests下载大文件_11种方法教你用Python高效下载资源!
  8. DirectX11中XNA数据库常见的几个函数
  9. Java生鲜电商平台-微服务入门与服务的拆分架构实战
  10. MySQL Hardware--FIO压测