有没有人听说过标准Windows消息框的这个奇怪的错误?
几年前,我正在搞乱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.如果你看一下
因此,对话框模板的内存布局在对话框标题后面紧跟字体规范. Visual Basic不使用Unicode,因此您调用的函数实际上是MessageBoxA().这只是一个thunk,它将传入的字符串从多字节转换为Unicode,然后调用MessageBoxW(). 我相信正在发生的事情是,由于某种原因,该字符串从多字节转换为Unicode要么出错,要么返回虚假长度值.当对话框模板在内存中构建时,这会产生连锁效应,在标题字符串后面立即破坏内存 – 正如我们所知,这是字体规范. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- winapi – 来自Win32应用程序的x64图像上的OpenP
- windows-server-2012-r2 – iSCSI附加存储的故障
- windows – 如果我调用GetOpenFileNameA,GetOpen
- Windows – IIS 6 SSL通过自定义VMware克隆后中断
- Windows安装程序 – 使用Visual Studio安装项目设
- windows-10 – 如何在Windows 10中获取文件的路径
- 处理错误输入
- Windows 8预加载器(加载图标)使用HTML5和JavaScr
- windows-phone-7 – 在WP7上的“后退”按钮上退出
- .net – 错误23不是.resx文件上的有效Win32应用程