0

バグを修正する必要がある古いプロジェクト、WTL/VC++ があります。問題の 1 つ - 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 unsigned int

wParam 123171 unsigned int

lParam 0 ロング

lParam 0 ロング

Ctrl+Z -

uMsg 273 unsigned int

wParam 123179 unsigned int

lParam 0 ロング

これが意味をなさない場合は申し訳ありませんが、私の VC++ カンフーはかなり錆びています。どこでアイデアを探すべきか、誰かが私にヒントを与えることができれば、それは大歓迎です.

ありがとうございました!

O.

4

1 に答える 1

0

@Roman Rのおかげで、これが見つかりました。問題のウィンドウには、WM_COMMANDメッセージのハンドラーがなく、その基本クラスの1つに、メッセージをアクティブなウィンドウに転送することによって無限ループを生成する関数がありました。 。だから私はこのハンドラーを追加しました-

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

これは私にとって良い解決策のようです。

ありがとう!

于 2011-10-29T11:08:59.327 に答える