MFC: не сохраняются данные при перезагрузке / WM_ENDSESSION

Если я протестирую приложение MFC, отправив емуWM_ENDSESSIONиTRUEто есть заканчивается, фреймворк MFC вызывает . Все хорошо! Но я обнаружил, что когда обновление Windows или установщик MSI хотят перезагрузиться после установки чего-либо, «OnCloseDocument ()» не вызывается, и все данные теряются.

Глядя на код MFC, вы видите:

      // when Windows session ends, close all documents
void CFrameWnd::OnEndSession(BOOL bEnding)
{
    if (!bEnding)
        return;

    CWinApp* pApp = AfxGetApp();
    if (pApp != NULL && pApp->m_pMainWnd == this)
    {
        if (AfxGetThreadState()->m_lastSentMsg.lParam & ENDSESSION_CLOSEAPP)
        {
            // Restart Manager is restarting the application
            CDataRecoveryHandler *pHandler = pApp->GetDataRecoveryHandler();
            if (pHandler)
            {
                pHandler->SetShutdownByRestartManager(TRUE);

                // Just return here rather than doing more processing.
                // The final autosave will be handled in the WM_CLOSE handler,
                // because the Restart Manager allows 30 seconds for processing
                // that message, and only 5 seconds for processing WM_ENDSESSION.
                return;
            }
        }

        AfxOleSetUserCtrl(TRUE);    // keeps from randomly shutting down
        pApp->CloseAllDocuments(TRUE);

        // allow application to save settings, etc.
        pApp->ExitInstance();
    }
}

Я предполагаю, что должно происходитьENDSESSION_CLOSEAPPвызывается раздел, который ничего не сохраняет.

Это код в конструкторе приложения для менеджера перезапуска:

        // support Restart Manager
  m_dwRestartManagerSupportFlags=AFX_RESTART_MANAGER_SUPPORT_RESTART | AFX_RESTART_MANAGER_SUPPORT_RECOVERY;

Поскольку мне не нужно автосохранение, но даже если автосохранение составляет 5 минут, в нем все равно могут не сохраниться изменения. Как правильно обрабатывать его в MFC, чтобы обеспечитьOnCloseDocument()вызывается при отправке WM_ENDSESSION?

0 ответов

Другие вопросы по тегам