大佬教程收集整理的这篇文章主要介绍了有没有人听说过标准Windows消息框的这个奇怪的错误?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当标题文本有多个字符时触发错误,第一个字符是带有变音符号(‘ÿ’)的小写“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()builds a dialog template dynamically.如果你看一下DLGTEMPLATE
结构的描述,你会发现以下信息块:
因此,对话框模板的内存布局在对话框标题后面紧跟字体规范.
Visual Basic不使用Unicode,因此您调用的函数实际上是MessageBoxA().这只是一个thunk,它将传入的字符串从多字节转换为Unicode,然后调用MessageBoxW().
我相信正在发生的事情是,由于某种原因,该字符串从多字节转换为Unicode要么出错,要么返回虚假长度值.当对话框模板在内存中构建时,这会产生连锁效应,在标题字符串后面立即破坏内存 – 正如我们所知,这是字体规范.
以上是大佬教程为你收集整理的有没有人听说过标准Windows消息框的这个奇怪的错误?全部内容,希望文章能够帮你解决有没有人听说过标准Windows消息框的这个奇怪的错误?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。