CString::Format出现的Buffer too small错误

在调试的过程中,由于主框架程序调用了我自己封装的一个采集模块组件,这个组件采用mfc dll封装成COM的形式进行调用,但是在主框架程序中调用这个模块老是有问题,在显示采集模块窗口界面的时候就出现“Expression Buffer too small”的错误提示,如下图。

调试都没有办法进行,于是上网查找了下,说可能是CString::Format这个函数出现的问题,于是我仔细的查看了代码,结果发现在窗口界面的初始化OnInitDialog函数中有下面的这句代码:

m_strFBL.Format("%s(放大约%d倍)", m_strFBL, m_nfbl / m_nScreenDPI);

Format中的参数为m_strFBL字符串本身,我估计是Format在内部根据格式化参数列表会对字符串本身的内存空间进行重新分配,而如果直接采用字符串本身作为参数传入的话,这个过程中就会造成内存的冲突,而这个冲突是无法预见的,查看了下msdn,微软也作了相应的注释:

The call will fail if thestring object itself is offered as a parameter to Format. For example, thefollowing code:

CString str = "SomeData";

str.Format("%d%d", str, 123);      //Attention:str is also used in the parameter list. will cause unpredictable results.

所以为了避免这种无法预见的问题,我们最好不要采取将字符串本身作为参数作为Format的参数,可以另外定义一个CString变量:

CString str;

str.Format(Format("%s(放大约%d倍)", m_strFBL, m_nfbl / m_nScreenDPI);

这样问题就解决了。

之前遇到如下一个问题:

程序运行出错:f:\dd\vctools\crt_bld\self_x86\crt\src\vsprintf.cLine:244”

Expression:("Buffer too small", 0).

最初以为是自己程序中sprintf使用不当造成的,就是就Grep出所有的sprintf,一个一个查,还是没有查出问题所在。

过了许久,已经忘了是哪个线索让我查出来是CString.Format时使用自身作为参数而调用失败了。(奇怪的是这个失败并不总会发生。我们程序中“隐藏”的这个问题年初就存在,可一直没有被发现过,而且可以肯定这段代码测试时被多次执行过。更奇怪的是,这个问题是两个团队几乎同时发现的。难道下面说的“不可预测”还与系统时间有关吗?至今无解!)

MSDN中对这个错误使用有过特别的记载——

The call will fail if the string object itself isoffered as a parameter to Format. For example, the following codewill cause unpredictable results:

CAtlString str = _T("Some Data");

str.Format(_T("%s%d"), str, 123);

// Attention: str is also used in theparameter list.

参考阅读——

1. 《 CString.Format使用一例》 http://blog.csdn.net/mxclxp/article/details/7393237

2. 《vc中CString::Format出现的Buffer too small错误(转)》 http://blog.csdn.net/zhulingfeng8726/article/details/7077341

CString::Format出现的Buffer too small错误相关推荐

  1. MFC中的CString.Format及CString,string,char*之间的转换

    1.CString.Format的使用:https://blog.csdn.net/wangkaishou/article/details/5846152 2.CString,string,char* ...

  2. MFC中CString.format用法

    MFC中CString.Format的详细用法 收藏  在MFC程序中,使用CString来处理字符串是一个很不错的选择. CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的 ...

  3. CString::Format

    CString::Format // 看代码,针对format带参数列表的情况没整明白,于是开始百度,搜索百度一大圈没找到好的解答,最后还是微软靠谱,与大家分享. voidFormat(LPCTSTR ...

  4. MFC中CString.Format的用法

    http://www.cnblogs.com/kongtiao/archive/2012/06/13/2548033.html 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CSt ...

  5. CString Format 乱码问题

    CString m_buf; CStatic *m_static; char *szName; ... m_buf.Format(":%s",szName); m_static-& ...

  6. CString .Format

    在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CString的Format方法给我们进行字符串的 ...

  7. CString Format

    浮点型转换为CString, 当小数位数不断变化时, 可以使用 CString tempStr; tempStr.Format(_T("%%.%df"), m_iDigit);// ...

  8. VC:CString.Format()函数详解

    在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CString的Format方法给我们进行字符串的 ...

  9. CString.Format的详细用法(转)

    2019独角兽企业重金招聘Python工程师标准>>> 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处 ...

最新文章

  1. Qt学习五 - 对话框
  2. vue.config.js配置不生效_华为QoS流策略配置教程
  3. python基础知识选择题-99道经典练习题助你全面掌握python基础知识,附技巧答案...
  4. 【Android开发学习笔记之一】5大布局方式详解
  5. 【Qt】 Qt中实时更新UI程序示例
  6. django ORM相关的那些操作汇总
  7. c# combobox集合数据不显示_Excel也能玩转百万数据
  8. Musik音乐社区整套UI网站模板
  9. linux e1000e 网卡驱动,在centos7上安装intel e1000e 网卡驱动
  10. linux7无法进入系统,记录一次断电导致centos7.4系统不能正常进入的解决方案
  11. Qt Creator 添加自定义注释
  12. MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题
  13. 【习题 3-1 UVA - 1585】Score
  14. ABAP BYPASSING BUFFER 及 表缓存,缓冲概念 SAP
  15. 虚拟机安装panabit详细图解
  16. 微信小程序电影推荐demo实战开发小结(附源码及思维导图) ... ...
  17. 自学平面设计,不能不知道的基础知识点是什么?
  18. android 蓝牙ble调试助手,Android蓝牙调试助手源码分享
  19. 重卡自动驾驶进入“正规战”
  20. E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?(解决方法)

热门文章

  1. 序列化、模块 day21
  2. MyCat的安装及基本使用(MySQL分库分表)
  3. 代码描述10911 - Forming Quiz Teams
  4. linux之man命令
  5. cin.ignore()函数的使用
  6. (待补充)CSS进阶--flex布局
  7. iOS 实现简单的列表预加载
  8. information_schema系列五(表,触发器,视图,存储过程和函数)
  9. 接口可以继承多个接口总结
  10. PayPal网站付款标准版(for PHP)