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?