Окно / форма WTL падает после того, как бесконечный цикл сообщений вызывает переполнение стека - PullRequest
0 голосов
/ 28 октября 2011

У меня есть устаревший проект, в котором мне нужно исправить ошибки, 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, «вырезать» и"отменить"

больше информации о фатальных сообщениях:

Ctrl + X -

uMsg 273 без знака int

wParam 123171 без знака int

lParam 0 long

lParam 0 long

Ctrl + Z -

uMsg 273 без знака int

wParam 123179 без знака int

lParam 0 long

Извините, если это не имеет смысла, мой VC ++ кунг-фу довольно ржавый;Если бы кто-нибудь мог дать мне подсказку, где искать идеи, это было бы очень признательно.

Спасибо!

O.

1 Ответ

0 голосов
/ 29 октября 2011

Обнаружил это, благодаря @Roman R. - в рассматриваемом окне не было обработчика для сообщения WM_COMMAND, и в одном из его базовых классов была функция, которая генерировала бесконечный цикл путем пересылки сообщения обратно активное окно. Поэтому я добавил этот обработчик -

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

что мне кажется хорошим решением.

Спасибо!

...