【问题标题】:Delphi XE6 issue with styled menus and madExceptDelphi XE6 样式菜单和 madExcept 问题
【发布时间】:2014-10-17 00:52:03
【问题描述】:

我遇到了 Delphi VCL Styles 的一个非常奇怪的行为。启用 VCL 样式后,当 madExcept 激活“缓冲区溢出时立即崩溃”选项时,菜单将变为非样式。

关闭此选项或将其切换为“在缓冲区 UNDERrun 时立即崩溃”可修复菜单问题。

问题是:有没有其他人遇到过这个问题?为什么会发生以及如何解决?

【问题讨论】:

    标签: delphi delphi-xe6 vcl-styles madexcept


    【解决方案1】:

    这似乎表明 VCL 样式代码存在缓冲区溢出。 madExcept 内存管理器成功地使缓冲区溢出显示为异常。反过来,样式代码通过禁用样式来响应。

    下一步是在调试器下运行代码,并启用调试 DCU,以便您可以调试 VCL 代码。希望调试器能够捕获异常,然后突出显示缓冲区溢出。

    如果您成功确定了问题,您可以制定解决方法并向 QC 提交错误报告。

    【讨论】:

    • 问题是——也不例外。即使启用了调试 DCU... 异常可能会以某种方式被静音。将进一步调查。 VCL Styles 代码的质量值得怀疑:(
    • 很难看出这个 madExcept 功能除了例外情况外如何实现。也许您的 ide 设置会抑制调试器中的通知。
    • 是的,madExcept 应该在缓冲区溢出的情况下产生异常。所有通知都已启用,这是我检查的第一件事。我也进行了测试,它捕获了我的测试缓冲区溢出。我不确定这是 VLC 错误,还是与 madExcept 有关。你能重现这个问题吗?
    • 我手边没有电脑。可能值得在 madExcept 论坛上发布。
    • 我在这里留下这个答案,因为它提供了如何调试此类问题的一般指南
    【解决方案2】:

    此问题是由对 GetClassName WinAPI 函数的内部调用引起的。我刚刚对此进行了测试并上传了一个修复程序。因此,您可以从repository 下载VCL Styles Utils 项目的最新版本,然后将单元Vcl.Styles.Utils.MenusVcl.Styles.Utils.SysControlsVcl.Styles.Utils.SysStyleHook 添加到您的项目中,最后注释或删除Line (27) {$UNDEF UseVCLStyleUtilsMenu}Vcl.Styles.Utils.Menus 单元中。

    【讨论】:

    • 是的,但非常罕见。
    • 你的修复是错误的。 GetClassName 的最终参数是字符长度。您以字节为单位传递大小。您必须通过 256 但通过 512。因此您的代码也有缓冲区溢出。但仍然 +1。
    • 原始代码的问题在于调用了 api 并且没有执行错误检查。因此,我建议对整个代码库进行审计,以检查其他忽略错误检查的调用。另一个奇怪的是毫无意义的 GetMem。我还会审核类似的虚假堆分配。
    • 谢谢大卫,我只是修改了参数。关于您的建议,我一直在审核、测试和重构代码 :)
    • 感谢您的修复。但是为什么我没有提出异常呢?
    猜你喜欢
    • 2014-08-27
    • 2015-10-14
    • 1970-01-01
    • 2014-08-27
    • 2016-12-11
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多