MF C - Странное нарушение доступа при отправке сообщения WM_IDLEUPDATECMDUI - PullRequest
0 голосов
/ 24 апреля 2020

В настоящее время я пересматриваю код старого приложения MF C, которое я обновил для компиляции с Visual Studio 2017. Это приложение содержит несколько фреймов MDI.

Однако есть странное нарушение доступа происходит случайным образом, когда я закрываю эти кадры, что я не могу понять, в основной форме следующая функция:

BOOL PSS_App::OnIdle(LONG count)
{
    if (!count)
        if (m_pMainWnd)
        {
            // look for any top-level windows owned by this class. NOTE handlers are used to
            // avoid generation of too many temporary CWnds
            for (HWND hWnd = ::GetWindow(m_pMainWnd->m_hWnd, GW_HWNDFIRST); hWnd; hWnd = ::GetNextWindow(hWnd, GW_HWNDNEXT))
                if (::GetParent(hWnd) == m_pMainWnd->m_hWnd)
                {
                    // if owned window is active, move the activation to the application window
                    if (GetActiveWindow() == hWnd && !::GetCapture())
                        m_pMainWnd->SetActiveWindow();

                    // update the buttons for the top-level window
                    ::SendMessage(hWnd, WM_IDLEUPDATECMDUI, WPARAM(TRUE), 0L);
                }
        }

    return CWinApp::OnIdle(count);
}

Проблема возникает, когда вызывается функция ::SendMessage(hWnd, WM_IDLEUPDATECMDUI, WPARAM(TRUE), 0L);. Я попытался получить имя класса hWnd, используя следующий код:

char lpClassName[256];
::GetClassName(hWnd, lpClassName, 256);

В результате я получил tooltips_class32, но я не знаю, к какому классу он относится. Если я попытаюсь изменить код следующим образом:

// update the buttons for the top-level window
if (std::strcmp(lpClassName, "tooltips_class32") != 0)
    ::SendMessage(hWnd, WM_IDLEUPDATECMDUI, WPARAM(TRUE), 0L);

Проблема больше не возникает в этой функции, и я могу без проблем закрыть свои дочерние MDI-кадры, однако другое нарушение доступа происходит случайно, когда основной форма теряет фокус (например, когда я нажимаю вне приложения).

Может кто-нибудь объяснить мне, что здесь происходит, или хотя бы предоставить мне информацию о том, что может произойти? Что такое tooltips_class32, и какой класс может наследовать его в MF C? Или это элемент управления, связанный с ActiveX?

ПРИМЕЧАНИЕ Я не знаю, может ли это иметь ссылку, но основное приложение наследует от CWinApp, который наследует от CWinThread. Приложение не использует многопоточность, за исключением экрана spla sh. Однако проблема остается той же, даже если я полностью деактивирую экранный код spla sh.

ПРИМЕЧАНИЕ также в том, что приложение представляет собой огромное приложение, содержащее около 30 подключенных библиотек DLL. Пока я не могу запустить его в Debug, потому что другое странное нарушение доступа происходит в одном из модулей, когда он загружается, что происходит в Debug, но никогда в Release. Таким образом, приложение в настоящее время работает в выпуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...