无限消息循环导致堆栈溢出后,WTL窗口/窗体崩溃

时间:2011-10-28 14:36:23

标签: visual-c++ wtl

我有一个遗留项目,我需要修复WTL / VC ++中的错误。其中一个问题 - 使用Ctrl + X或Ctrl + Z键后主窗口(当然是整个应用程序)崩溃。我没有为这些键分配任何自定义加速器。  我发现“致命”键组合会导致无限的消息循环

uMsg == 273 (0x00000111)

最终因堆栈溢出错误而崩溃:

 Command Code: 5, ID: 29892, HANDLE:  0xe091aFirst-chance exception at 0x007f88fa 
 in <myApp>.exe: 0xC00000FD: Stack overflow.
 Unhandled exception at 0x007f88fa in <myApp>.exe: 0xC00000FD: Stack overflow.

我只是在消息处理函数中修补它 -

BEGIN_MSG_MAP(CMDIChildWindowImpl)

    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_CLOSE, OnClose)
    MESSAGE_HANDLER(WM_TIMER, OnTimer)

* *

    COMMAND_ID_HANDLER(ID_FILE_NEW, OnNewDownload)
    COMMAND_ID_HANDLER(ID_UPLOAD_FOLDER_SET, OnUploadFolderSet)
    COMMAND_ID_HANDLER(ID_OPEN_RECORD_BY_ID, OnOpenOnline)

* *

    NOTIFY_CODE_HANDLER(HLN_PORTAL_RECORD_DOWNLOAD, OnPortalPageNotify);
    NOTIFY_CODE_HANDLER(HLN_SELCHANGED, OnWebFormNotify);
    if(uMsg == 273)
     return false;
    else
     CHAIN_MSG_MAP(baseClass)

END_MSG_MAP()

但我对这个创可贴补丁并不满意,了解发生了什么事情会很好 - 而且我真的希望这些关键组合在我的表单上执行Windows默认操作,“剪切”和“撤消”< / p>

有关致命消息的更多信息:

Ctrl + X -

uMsg 273 unsigned int

wParam 123171 unsigned int

lParam 0 long

lParam 0 long

Ctrl + Z -

uMsg 273 unsigned int

wParam 123179 unsigned int

lParam 0 long

对不起,如果这没有意义,我的VC ++功夫相当生疏;如果有人能给我一个提示,在哪里寻找这些想法,那将非常感激。

谢谢!

0

1 个答案:

答案 0 :(得分:0)

感谢@Roman R. - 在相关窗口中,没有WM_COMMAND消息的处理程序,并且在其一个基类中有一个函数通过将消息转发回来生成无限循环活动窗口。所以我添加了这个处理程序 -

        if(uMsg == WM_COMMAND)
          return DefWindowProc(WM_COMMAND, wParam, lParam);

这对我来说似乎是一个很好的解决方案。

谢谢!