碰到一个微软的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关系数据库SQL之可编程性函数(用户自定义函数)

前言 在关系型数据库中除了前面几篇基本的数据库和数据表操作之外,还提供了可编程性的函数、存储过程、事务、触发器及游标。 本文介绍的是函数。 函数分为两种: 系统函数用户自定义函数准备工作 这里以银行存取款为例说明。 1、创建数据表 --创建账户信…

土压力图怎么画_电气系统图怎么画?

电气系统图,又称为电气系统控制图,是通过使用国家规定的图形符号和文字代号代表各种电器、电机及元件,根据生产机械的要求和各种电器的原理,用线条代表导线连接起来,用于展示供电线路与各设备工作原理及其相互关系的一…

mvc

Model、View、Controller 一、Model Proxy-->数据端(与远程服务器通信) 二、view Mediator--->操作视图组件(添加事件监听器,发送或接收Notification) 三、Controller Command映射(获取Proxy,通过收发Notification操作别的Command) 框架以外要做的&#xff1a…

C#中往数据库插入/更新时候关于NUll空值的处理

本文转载:http://blog.csdn.net/chybaby/article/details/2338943 今天碰到个问题。。SqlCommand对传送的参数中如果字段的值是NULL具然不进行更新操作,也不提示任何错误。。。百思不得其解。。。先作个记录,再查资料看看什么原因。 暂时的解…

考勤助手——数据库3.0版本

基于数据库1.0及2.0版本,我们将细节的地方逐一进行讨论,设计出了数据库3.0版本。 根据ER图,进行基本表的设计如下: 转载于:https://www.cnblogs.com/GG-TEN/p/5471019.html

System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误

这个错误主要是因为INSERT INTO 语句里包括了access的关键字,可以通过对插入的字段中加上括号[]即可。如:insert into key_list([key],[ZM]) values(key,ZM)即可解决。转载于:https://www.cnblogs.com/liuhaitao/archive/2011/07/07/2100561.html

Ruby中的%表示法

%{String} 用于创建一个使用双引号括起来的字符串 %Q{String} 用于创建一个使用双引号括起来的字符串 %q{String} 用于创建一个使用单引号括起来的字符串 %r{String} 用于创建一个正则表达式字面值 %w{String} 用于将一个字符串以空白字符切分成一个字符串数组…

幽灵交易策略_幽灵交易者策略(附源代码)

NO1 . 前言正如幽灵交易者的名字,该策略的核心思路是,在真实下单交易之前,先虚拟出一个交易,如果这个虚拟的交易是亏损的,那么下一次才启动真实的交易。NO2 . 策略简介该策略思路源自于交易者的观察,交易者…

test blog

blogsdf sdfsd转载于:https://blog.51cto.com/11570194/1771304

面向对象66原则

你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。 ----- Arthur J.Rie…

并行编程——内存模型之缓存一致性

1 定义 缓存一致性 Cache coherence 简称 CC, 缓存一致性协议是在共享缓存多处理器架构确保最终一致性最突出、最重要的机制。这些协议在缓存线(cache-line)级别实现了对一致性的保证。缓存线是从主内存中读取数据和向内存中写入数据的缓存单…

Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

本节通过日志文件详细分析 instance start 操作。下面是 start instance 的流程图向 nova-api 发送请求nova-api 发送消息nova-compute 执行操作下面我们详细讨论每一个步骤。 向 nova-api 发送请求客户(可以是 OpenStack 最终用户,也可以是其他程序&…

失望时想起了你是什么歌_你是空你是空是什么歌 你是风你是风什么歌

“你是空,你是空”“你是风,你是风”“下起雨想起了你”前奏的歌曲最近在抖音受到很多人的喜欢,想要找到完整版歌词作为BGM,这首歌非常的洗脑,你是空你是空是什么歌?你是风什么歌?下面八宝网带来…

linux screen 命令详解

一、背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它…

ASP.NET MVC从视图传递多个模型到Controller

从后台组织好数据然后传递到页面倒是水到渠成很方便,因为MVC自身就将这样的需求内建到了这个系统中。我只需要在后台组织好一个List 或IEnumerable类型的变量,将需要传递的数据模型扔进去便可。 比如这里我们向视图返回5条product信息在页面进行展示&…

mysql存储过程_Mysql存储过程

存储过程存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据&am…

修复IE9-- safari 的sort方法

解决方案其实就是冒泡排序的一个包装 本补丁不修复各浏览的排序算法不一致的问题 当前版本 v0.2v0.1 修复IE9-- Array.prototype.sort 不能根据 对象属性 做排序的遗憾v0.2 修复safari 不支持函数参数 ; !function(window){var ua window.navigator.userAgent.toLowerCase(),r…

还原virtual函数的本质-----C++

当你每次看到C类中声明一个virtual函数,特别是看到了一个virtual的虚构函数。你知道它的意思吗?你肯定会毫不犹豫的回答:不就是多态么。。。在运行时确定具体的行为么。。。完全正确,但这里我要讲的不只是这些东西。 有些类需要虚…

C++实践参考——数组类运算的实现

【项目-数组类运算的实现】   设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造、析构函数)和运算符重载的函数。   实现策略提示:可以将测试函数中的语句加上注释,取消一句的注…

MySQL支持的四种索引_Mysql常见四种索引的使用

提到mysql优化,索引优化是必不可少的。其中一种优化方式 ——索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升。我们知道项目性能的瓶颈主要是在"查(select)"语句,要提升"查"这一性能,…