wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了有没有人听说过标准Windows消息框的这个奇怪的错误?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

几年前,我正在搞乱Visual Basic,我发现了MsgBox函数的一个错误.我试着寻找它,但没有人曾经说过这件事.它不仅仅是Visual Basic;它与任何使用标准 Windows MessageBox API调用的东西有关. 当标题文本有多个字符时触发错误,第一个字符是带有变音符号(‘ÿ’)的小写“y”.这个角色有什么特别之处?它几乎绝对不是角色本身,而是它的特殊ASCII值. ‘ÿ’是字
几年前,我正在搞乱Visual Basic,我发现了MsgBox函数一个错误.我试着寻找它,但没有人曾经说过这件事.它不仅仅是Visual Basic;它与任何使用标准 Windows MessageBox API调用的东西有关.

标题文本有多个字符时触发错误,第一个字符是带有变音符号(‘ÿ’)的小写“y”.这个角色有什么特别之处?它几乎绝对不是角色本身,而是它的特殊ASCII值. ‘ÿ’是字符255(0xFF),意味着它是可以存储在无符号字节中的最高值,并且其所有位都设置为1.

这个bug有什么作用?嗯,有两种不同的可能性,这取决于标题文本中的字符数.如果标题文本中有偶数个字符(除非它是2),则不会出现任何消​​息框,您只是听到警报声.如果标题文本中有两个字符,或者除了1之外的任何奇数(在这种情况下不会触发错误)……那么会发生这种情况:

而且这还不是全部 – 消息也将被截断为一行.考虑到使用此API调用的频率,这似乎是至少在一个半高调事件中会发生的那种错误.互联网上有没有这方面的报道,或者有什么可能导致它的原因?也许这是与Unicode相关的故障,就像记事本中的“布什隐藏事实”故障一样?

我做了一个程序,以防你想玩这个; download it here.

或者,将以下内容复制到记事本中,使用.vbs扩展名保存,然后双击它以显示上面显示的对话框:

MsgBox "Windows 3.1 font,anyone?","ÿ ODD NUMBER!"

或者换一种不同的字体:

MsgBox "I CAN HAS CHEEZBURGER?","ÿ HImpact"

编辑:似乎如果前四个字符是ÿ,它不会显示消息,即使有奇数个字符.

解决方法

一个奇怪的错误.我怀疑症状是MessageBox()实际显示对话框的方式的结果.

在内部,MessageBox()builds a dialog template dynamically.如果你看一下DLGTEMPLATE结构的描述,你会发现以下信息块:

因此,对话框模板的内存布局在对话框标题后面紧跟字体规范.

Visual Basic不使用Unicode,因此您调用函数实际上是MessageBoxA().这只是一个thunk,它将传入的字符串从多字节转换为Unicode,然后调用MessageBoxW().

我相信正在发生的事情是,由于某种原因,该字符串从多字节转换为Unicode要么出错,要么返回虚假长度值.当对话框模板在内存中构建时,这会产生连锁效应,在标题字符串后面立即破坏内存 – 正如我们所知,这是字体规范.

大佬总结

以上是大佬教程为你收集整理的有没有人听说过标准Windows消息框的这个奇怪的错误?全部内容,希望文章能够帮你解决有没有人听说过标准Windows消息框的这个奇怪的错误?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: