工作中遇到的这个问题还是很有意思的。其中嵌套了很多奇葩性的问题。 (转载请指明出于breaksoftware的csdn博客)

我们来看下故事的发生过程,QA同学发现我们存在如下的bug

看到如此多的串,可以认为这个是典型的溢出问题。后来我咨询解决该问题的同学,他说这个bug在debug模式下不会出现,只有在release下才会出现(这个意味着,该问题很有可能是内存问题引起的,因为debug和release的一个很大的区别就是内存初始化和布局)。解决方案就是在筛选器后面加个\0。

    OPENFILENAME m_ofn;::ZeroMemory(&m_ofn, sizeof(m_ofn));m_ofn.lStructSize = sizeof(m_ofn);m_ofn.hwndOwner = m_hwnd;m_ofn.lpstrFilter =  L"png|*.png\0";

问题的确是解决了,但是我觉得微软设计接口也不至于如此弱吧。这样的奇葩的写法不应该是接口设计的规范。于是我研究了下为什么要加\0。
        我们看下 http://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx,它记录了OPENFILENAME结构体的说明,其中对lpstrFilter的说明有如下内容

lpstrFilter
Type: LPCTSTR
A buffer containing pairs of null-terminated filter strings. The last string in the buffer must be terminated by two NULL characters.

其中特别说明了,这个串的最后要以两个NULL(\0)结束。假如不是很熟悉windows设计的同学,可能此时已经感叹微软真的有这样奇葩的设计了。
        但是,真实的问题却是我们没有关注到的:这样的写Filter是正确的么?(需要转换下思维了)通过Filter这个名字,我们可以猜想到,这个是选择器,让我们的文件“打开,保存”框只筛选出符合我们规则的文件。我们看下画板程序的文件打开框的选择

此时我们选择的是jpeg格式,则显示了所有后缀为jpg的文件。如果我们选择png格式,则只显示后缀为png的文件。如下图

而用我们的代码打开的是

这可以见得,我们的筛选器失效了。这也意味着,我们的筛选器写法是有问题。找到这个问题,就离我们找到为什么lpstrFilter要以两个NULL结尾的问题不远了。
        其实我们仔细看下MSDN的说明。可以知道lpstrFilter保存的是若干个“字符串对”(A buffer containing pairs of null-terminated filter strings.)。这种设计思想,在windows上很多的,比如可以看http://blog.csdn.net/breaksoftware/article/details/3914358这篇文章中介绍的PendingFileRenameOperations注册表项,其记录的数据也是若干个“字符串对”。lpstrFilter中的每个“字符串对”,第一个字符串保存的是用于在框的“保存类型”中显示的文字,比如png;二个字符串保存的是“筛选规则”(不会显示出来,供窗口筛选用),比如*.png。而我们的窗口中显示的是png|*.png。此时似乎我们懂了点什么……这个就是我们写错了!我猜测这段代码的作者,也是希望做成有筛选功能的,否则也不用指定这个字段。但是他可能认为“|”是分隔符。于是便有了
            png                |             *.png
      (显示名)  (分隔符)  (筛选器)
        话说

这样的显示也忒不协调了!
        正确的写法是png\0*.png\0。
        可以想象下windows对这个串的处理:

  1. Search第一个\0,找到“显示字符串”
  2. 从前一个\0开始搜索第一个\0,寻找到“匹配规则串”
  3. 从前一个\0开始搜索第一个\0,如果位置和前一个\0不相邻,则走到1;否则结束搜索

这个流程就解释了为什么我们需要以两个连续的NULL结尾。
        这儿再多说两句,我们看下mspaint的保存框

这种组合的正确写法是

m_ofn.lpstrFilter =  L"单色位图(*.bmp;*.dib)\0*.bmp;*.dib\0\t16色位图(*.bmp;*.dib)\0*.bmp;*.dib\0\r256色位图(*.bmp;*.dib)\0*.bmp;*.dib\0\r24位位图(*.bmp;*.dib)\0*.bmp;*.dib\0JPEG(*.jpg;*.jpeg;*.jpe;*.jfif)\0*.jpg;*.jpeg;*.jpe;*.jfif\0GIF(*.gif)\0*.gif\0TIFF(*.tif;*.tiff)\0*.tif;*.tiff\0PNG(*.png)\0*.png\0";

打开,保存文件框的文本溢出排查相关推荐

  1. 关于文本溢出显示省略号、圣杯双飞翼布局、CSS Hack、PS基础、以及项目的一些规范

    溢出显示省略号 单行文本溢出显示省略号 方法一: .box{width:100px; ​border:1px solid red; ​/* 设置内容不换行 */white-space:nowrap;/ ...

  2. 转:记一次linux oom内存溢出排查过程

    @转:记一次linux oom内存溢出排查过程 记一次linux oom内存溢出排查过程 2018年08月16日 14:13:49 enchanterblue 阅读数 4099更多 分类专栏: --- ...

  3. Flutter RichText支持自定义文本溢出效果

    extended text 相关文章 Flutter RichText支持图片显示和自定义图片效果 Flutter RichText支持自定义文本溢出效果 Flutter RichText支持自定义文 ...

  4. css小经验: 转载 - CSS文本溢出省略号:text-overflow:ellipsis

    (转载: http://blog.163.com/yinwei_666/blog/static/2036157320101113102733794/) 很多时候,比如网站最基本的文章列表,标题会很长, ...

  5. 从零开始学前端:显示隐藏与文本溢出 --- 今天你学习了吗?(CSS:Day16)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:浮动 - 今天你学习了吗?(CSS:Day15) 文章目录 从零开始学前端:程序猿小白也可以完全掌握!-今 ...

  6. 2、多效果、太极图、党徽和五角星、时钟、animation、文本溢出显示省略号、Flex布局、Flex容器、链接状态、选择器、清除浮动、table表格合并、点击事件、半包围效

    2.多效果.太极图.党徽和五角星.时钟.animation.文本溢出显示省略号.Flex布局.Flex容器.链接状态.选择器.清除浮动.table表格合并.点击事件.半包围效.getBoundingC ...

  7. 文本溢出处理显示省略号

    一.文本溢出处理显示省略号 1.单行文本溢出显示省略号 方法1:省略号 单行文本: width:200px:设置盒子的宽度(限制宽度) white-space:nowrap:设置文本不换行 overf ...

  8. 前端学习:文本溢出隐藏

    直接开整 单行文本隐藏 .box {width: 150px;height: 30px;background-color: rgb(196, 196, 45);margin: 50px auto;wh ...

  9. VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)

    右击项目->属性->字符集:使用多字节字符集. 这样可以使用char到CString的转化. char sRead[20] = ""; CString strtest ...

最新文章

  1. Java I/O Demo
  2. 程序猿工作效率的影响因素和管理者怎样推断
  3. iOS之深入解析类加载的底层原理:类如何加载到内存中
  4. luogu P2516 [HAOI2010]最长公共子序列
  5. Redis 实用技术——事务
  6. android 点动态显示图片,Android用RecyclerView实现动态添加本地图片
  7. 云世界,一切如梦幻,数据也玩虚拟化。 SQL Server 2019 新特性系列一:数据虚拟化
  8. c语言文件操作函数(未完待续)
  9. shp设置utf8格式_shapefile与字符集编码设置
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园餐厅系统
  11. Pyspark:随机森林
  12. python网络编程 赵宏_【干货收藏】Python面试指南大全
  13. Intro to Xamarin.Android Xamarin Android入门教程 Lynda课程中文字幕
  14. [规划酱@国土空间] ArcGIS工具| 三调转换之新用地用海分类
  15. LeetCode(数据库)- 计算税后工资
  16. ISO/IEC JTC 1/SC 42人工智能分技术委员会第一次全会在京召开
  17. Druid——Hadoop-based Batch Ingestion
  18. SVAC 2.0安全系统组成
  19. 记一次发现某餐饮企业二维码支付漏洞的经历
  20. Oracle net architecture

热门文章

  1. 华为认证物联网开发利器:小熊派IoT开发板
  2. 连通域最小外接矩形算法原理_基于分割的文本检测算法之PSENet/PAN/DBNet
  3. java c 解决方案_Java jdk安装及javac命令无效解决方案
  4. python需要具备什么_入门Python需要掌握哪些技能呢?
  5. 强哥PS强化培训班课程目录
  6. 【通用CSS模板】移动端H5页面统一样式.css
  7. webstorm设置点击(单击)左侧项目资源管理器里面的文件,自动在右侧打开源代码文件
  8. 在Uubuntu 14.04 64bit上搭建NumPy函数库环境
  9. C# Unity编程终极指南
  10. 3D场景高级合成技术学习