加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

有没有人听说过标准Windows消息框的这个奇怪的错误?

发布时间:2020-12-14 02:03:51 所属栏目:Windows 来源:网络整理
导读:几年前,我正在搞乱Visual Basic,我发现了MsgBox函数的一个错误.我试着寻找它,但没有人曾经说过这件事.它不仅仅是Visual Basic;它与任何使用标准 Windows MessageBox API调用的东西有关. 当标题文本有多个字符时触发错误,第一个字符是带有变音符号(‘?’)的小
几年前,我正在搞乱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结构的描述,你会发现以下信息块:

In a standard template for a dialog box,the DLGTEMPLATE structure is
always immediately followed by three variable-length arrays that
specify the menu,class,and title for the dialog box. When the
DS_SETFONT style is specified,these arrays are also followed by a
16-bit value specifying point size and another variable-length array
specifying a typeface name.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读