碰到一个微软的bug:CWinAppEx::GetString
在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了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相关推荐
- 解决xib自定义tableFooterView一个神奇的bug
最近看视频学习,做一个demo的时候碰到一个神奇的bug,后来经过各种搜索.调试和修改代码虽然把这个bug解决了,但不知道为什么.这里打算把这个过程分享出来,给大家做参考顺便也求大神来指导下. 事情是 ...
- 一个 P4 的 Bug,就难倒了 JDK 吗 ?
作者 | 码农唐磊 来源 | 程序猿石头(ID:tangleithu) 背景 分享一下之前踩的一个坑,背景是这样的: 我们的项目依赖于一个外部服务,该外部服务提供 REST 接口供我方调用,这是很常见 ...
- 一个GDIPlus的Bug -- OutofMemory异常
今天发现 framework2.0中的一个GDIPlus的Bug: 在Form的OnPaint事件里面写如下代码: private void Form1_Paint(object sender, Pa ...
- AI一分钟|阿里云解释故障原因:触发了一个未知代码Bug;清华蝉联ISC18超算竞赛总冠军...
▌阿里云发说明解释昨日故障原因:触发了一个未知代码Bug 今日凌晨,阿里云官方微博针对昨日出现的大规模故障问题作出官方回应.声明称,在运维上的一个操作失误,导致一些客户访问阿里云官网控制台和使用 ...
- 珍惜鼠标,慎用双击。maxthon浏览器的双击功能毁了我一个微软鼠标一个罗技鼠标,伤心...
maxthon浏览器的双击关闭Tab的功能确实很方便. 但是没有想到用了一段时间之后,我的鼠标给毁了,一个微软鼠标一个罗技鼠标(几个在家里,一个在公司),双双出现这样的症状:单击识别成双击:按住左 ...
- Google是否会成为下一个微软?
在4月底,JP摩根邀请我参加一个"思想领导者聚餐"来讨论最近硅谷和数字媒体的事情.在旧金山Kokkari饭馆的私人包间里坐了有20来人,有来自著名VP公司.成功企业家和JP摩根的一 ...
- IOS7的一个神奇的Bug
2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处 今天跟龙强兄,没事在得瑟手机,结果无意中发现一个IOS7的bug,如果iphone未设置锁屏密码,但是分别设置 ...
- 给JDK报了一个P4的Bug,结果居然……
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 作者:程序猿石头/码农唐磊( ...
- 使用SAP WebIDE进行一个典型的bug修复流程
假设我们发现一个产品的bug需要修复,一般我们不会直接在master分支上做修改,而是专门新建一个供bug fix使用的分支,比如m1分支,测试提交后,再merge到master branch上. 下 ...
最新文章
- 大赛季(2020)新一代信息技术行业赛赛事公告
- git 恢复被覆盖本地提交内容
- 《Android 应用案例开发大全(第二版)》——导读
- 一个学妹写的按键检测函数把我秀翻了!
- 14、高可用keepalived搭建及切换
- (配置消息转换器) sso单点登入之jsonp改进版
- gps测量与数据处理第三版pdf_测量培训需要掌握哪些知识点呢?_东英时代何老师...
- ping网络诊断常见故障
- 浏览器打开就是360导航(浏览器被360劫持)
- 计算机产品校园营销方案,惠普笔记本电脑校园营销策划方案.doc
- 求95859回文数c语言程序,csdn 回文数
- Unirech腾讯云代充-云服务器登陆及远程连接常见问题
- Smart Construction:工程机械正在加速进入智能建设时代
- php账单明细功能怎么实现,php 处理微信账单
- 【BZOJ 1233】 干草堆
- java五子棋AI算法人机对战(春物彩羽版可下载试玩PC端)
- .NET iTextSharp PDF添加文字水印
- 详解super()函数
- 施乐服务器怎么显示浏览器,怎么才能显示出电脑IE浏览器的菜单栏和工具栏
- 华为 H3C 配置 Portal认证 mac-trigger快速认证 Mac无感知认证 Radius认证计费 对接 外部Portal认证计费系统 案例
热门文章
- 因为银行过度授信导致信用卡逾期还不上,可以拒绝还款吗?
- TESTb需要向至少十几家应用商店提交上线审核,且每个应用商店要求的资料可能都不一样,异常繁琐
- 成吉思汗的子孙:中国游牧蒙古人
- Power of Three
- iphone怎样关闭副屏_iPhone手机关掉这3个设置,不仅省电,而且手机还不会卡
- umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
- requests下载大文件_11种方法教你用Python高效下载资源!
- DirectX11中XNA数据库常见的几个函数
- Java生鲜电商平台-微服务入门与服务的拆分架构实战
- MySQL Hardware--FIO压测