打开,保存文件框的文本溢出排查
工作中遇到的这个问题还是很有意思的。其中嵌套了很多奇葩性的问题。 (转载请指明出于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对这个串的处理:
- Search第一个\0,找到“显示字符串”
- 从前一个\0开始搜索第一个\0,寻找到“匹配规则串”
- 从前一个\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";
打开,保存文件框的文本溢出排查相关推荐
- 关于文本溢出显示省略号、圣杯双飞翼布局、CSS Hack、PS基础、以及项目的一些规范
溢出显示省略号 单行文本溢出显示省略号 方法一: .box{width:100px; border:1px solid red; /* 设置内容不换行 */white-space:nowrap;/ ...
- 转:记一次linux oom内存溢出排查过程
@转:记一次linux oom内存溢出排查过程 记一次linux oom内存溢出排查过程 2018年08月16日 14:13:49 enchanterblue 阅读数 4099更多 分类专栏: --- ...
- Flutter RichText支持自定义文本溢出效果
extended text 相关文章 Flutter RichText支持图片显示和自定义图片效果 Flutter RichText支持自定义文本溢出效果 Flutter RichText支持自定义文 ...
- css小经验: 转载 - CSS文本溢出省略号:text-overflow:ellipsis
(转载: http://blog.163.com/yinwei_666/blog/static/2036157320101113102733794/) 很多时候,比如网站最基本的文章列表,标题会很长, ...
- 从零开始学前端:显示隐藏与文本溢出 --- 今天你学习了吗?(CSS:Day16)
从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:浮动 - 今天你学习了吗?(CSS:Day15) 文章目录 从零开始学前端:程序猿小白也可以完全掌握!-今 ...
- 2、多效果、太极图、党徽和五角星、时钟、animation、文本溢出显示省略号、Flex布局、Flex容器、链接状态、选择器、清除浮动、table表格合并、点击事件、半包围效
2.多效果.太极图.党徽和五角星.时钟.animation.文本溢出显示省略号.Flex布局.Flex容器.链接状态.选择器.清除浮动.table表格合并.点击事件.半包围效.getBoundingC ...
- 文本溢出处理显示省略号
一.文本溢出处理显示省略号 1.单行文本溢出显示省略号 方法1:省略号 单行文本: width:200px:设置盒子的宽度(限制宽度) white-space:nowrap:设置文本不换行 overf ...
- 前端学习:文本溢出隐藏
直接开整 单行文本隐藏 .box {width: 150px;height: 30px;background-color: rgb(196, 196, 45);margin: 50px auto;wh ...
- VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)
右击项目->属性->字符集:使用多字节字符集. 这样可以使用char到CString的转化. char sRead[20] = ""; CString strtest ...
最新文章
- Java I/O Demo
- 程序猿工作效率的影响因素和管理者怎样推断
- iOS之深入解析类加载的底层原理:类如何加载到内存中
- luogu P2516 [HAOI2010]最长公共子序列
- Redis 实用技术——事务
- android 点动态显示图片,Android用RecyclerView实现动态添加本地图片
- 云世界,一切如梦幻,数据也玩虚拟化。 SQL Server 2019 新特性系列一:数据虚拟化
- c语言文件操作函数(未完待续)
- shp设置utf8格式_shapefile与字符集编码设置
- 基于JAVA+SpringMVC+Mybatis+MYSQL的校园餐厅系统
- Pyspark:随机森林
- python网络编程 赵宏_【干货收藏】Python面试指南大全
- Intro to Xamarin.Android Xamarin Android入门教程 Lynda课程中文字幕
- [规划酱@国土空间] ArcGIS工具| 三调转换之新用地用海分类
- LeetCode(数据库)- 计算税后工资
- ISO/IEC JTC 1/SC 42人工智能分技术委员会第一次全会在京召开
- Druid——Hadoop-based Batch Ingestion
- SVAC 2.0安全系统组成
- 记一次发现某餐饮企业二维码支付漏洞的经历
- Oracle net architecture
热门文章
- 华为认证物联网开发利器:小熊派IoT开发板
- 连通域最小外接矩形算法原理_基于分割的文本检测算法之PSENet/PAN/DBNet
- java c 解决方案_Java jdk安装及javac命令无效解决方案
- python需要具备什么_入门Python需要掌握哪些技能呢?
- 强哥PS强化培训班课程目录
- 【通用CSS模板】移动端H5页面统一样式.css
- webstorm设置点击(单击)左侧项目资源管理器里面的文件,自动在右侧打开源代码文件
- 在Uubuntu 14.04 64bit上搭建NumPy函数库环境
- C# Unity编程终极指南
- 3D场景高级合成技术学习