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

Visual c++ 无限消息循环导致堆栈溢出后WTL窗口/窗体崩溃,visual-c++,wtl,Visual C++,Wtl,我有一个遗留项目,我需要在WTL/VC++中修复bug。其中一个问题是使用Ctrl+X或Ctrl+Z键后主窗口(当然是整个应用程序)崩溃。我没有为这些键指定任何自定义加速器。 我发现“致命”键组合会导致一个无限的消息循环 uMsg==273(0x00000111) 最终因堆栈溢出错误而崩溃: 命令代码:5,ID:29892,句柄:0xE091A 0x007f88fa处的第一次机会异常 in.exe:0xC00000FD:堆栈溢出。 .exe中0x007f88fa处的未处理异常:0xC00000F

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

uMsg==273(0x00000111)

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

命令代码:5,ID:29892,句柄:0xE091A 0x007f88fa处的第一次机会异常
in.exe:0xC00000FD:堆栈溢出。
.exe中0x007f88fa处的未处理异常:0xC00000FD:堆栈溢出。
我只是在消息处理功能中修补了它-

开始消息映射(CMDIChildWindowImpl)

* *

* *

END_MSG_MAP()

但是我不满意这个创可贴补丁,很好地理解正在发生的事情-而且实际上我希望这些键组合在我的窗体上做Windows默认的东西,“剪切”和“撤消”< /P> 有关致命消息的更多信息:

Ctrl+X-

uMsg 273无符号整数

wParam 123171无符号整数

lParam 0长

lParam 0长

Ctrl+Z-

uMsg 273无符号整数

wParam 123179无符号整数

lParam 0长

对不起,如果这不合理,我的VC++功夫已经生锈了;如果有人能给我一个提示,在哪里可以找到这些想法,我将不胜感激

谢谢大家!


O.

发现了这一点,这多亏了@Roman R.-在所讨论的窗口中,WM_命令消息没有处理程序,并且在它的一个基类中,有一个函数通过将消息转发回活动窗口来生成无限循环。所以我添加了这个处理器-

        if(uMsg == WM_COMMAND)
          return DefWindowProc(WM_COMMAND, wParam, lParam);
这对我来说似乎是个好办法


谢谢

273
WM_命令
,您似乎一直在反弹该命令,直到它填满堆栈。上面的代码片段并没有显示出错误的地方。我明白了,WM_命令-所以我也应该仔细检查wParams,不要过滤掉其他菜单/加速器等等。谢谢,我应该更加坚持不懈地寻找代码是什么。我猜它会反弹,因为它不是在“基类”中处理的,而是被转发回“子类”中。至于代码,我真的不知道在这里发布什么会有帮助。再次感谢你,罗曼!正常的操作流程是
命令ID\u处理程序
命令ID\u处理程序
WM\u命令
的任何处理程序处理消息并在那里终止处理。您可能遇到的情况是,该处理程序启动一些活动,生成相同的通知,并向上滚动到堆栈溢出。因此,处理程序很重要。你还有一个包含细节的调用堆栈。太棒了!在这个窗口/类和它的基窗口/类中都没有WM_命令的消息_处理程序,并且有一个链式调用/重定向消息转发导致了无限循环。谢谢你的帮助!这仍然是一种没有说出来的气味。我想说的是,您不需要处理程序行,相反,您应该寻找一个位置不正确的转发行,以完成循环引用。
    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)
        if(uMsg == WM_COMMAND)
          return DefWindowProc(WM_COMMAND, wParam, lParam);