Visual StudioC++新特性–MFC王者歸來(3)MFC新功能-基於windows7的重啟管理災難恢複

來源:互聯網
上載者:User

為了提高使用者體驗,讓使用者用起來感覺比較爽,Microsoft在Windows Vista系統中首先引入了重啟管理器(Restart Manager)。

就類似office2007的自動儲存功能,一旦出了故障,可以恢複自己的工作成果,不至於讓自己工作成果因為故障而丟失。

它可以輔助應用程式維護其當前運行狀態,當軟體更新後需要重新啟動,或者是遇到非常嚴重的問題崩潰後,可以重新啟動軟體並且恢複到軟體的當前工作狀態。更重要的是,它還可以恢複自動儲存的軟體資料狀態,盡量保證使用者資料的安全。有了重啟管理器,軟體就可以很快地從災難中恢複過來,實現快速“災後重建”。

微軟平台產品及服務部門總裁Jim Allchin向eweek透露,如果一個應用程式或作業系統本身需要更新,安裝器就會喚出Restart Manager。Restart Manager負責查看是否能清除作業系統的相關部分,以更新它。如果可以的話,系統就不必重新啟動了。
 在即將王者歸來的Visual c++2010在MFC增加了Restart Manager支援。
重啟管理器主要應用在下面兩個方面:
◆軟體更新
很多時候,軟體或者作業系統升級後,需要重新啟動才可以生效。在這種情況下,我們就可以使用重啟管理器自動關閉真正啟動並執行軟體,然後進行更新,更新完成後自動重新啟動軟體,並且恢複到軟體當前的工作狀態。這將使得軟體的更新更加流暢和智能。
◆軟體災難恢複
當軟體遇到嚴重錯誤,進程崩潰的時候,可以使用重啟管理器重新啟動軟體,恢複軟體自動保持的資料,讓軟體可以快速地從災難中恢複過來。
為了支援重啟管理器,微軟提供了一套Restart Manassas API函數來完成這些工作。這些函數定義在標頭檔中,如果你的應用程式想使用這套API,需要引用rstrtmgr.lib和rstrtmgr.dll。其中,我們常用的函數有:
◆RMStartSession
建立一個新的重啟任務。
◆RMGetList
這個函數可供安裝程式使用,它可以得到所有被影響的應用程式及其目前狀態。
◆RMRegisterResources
註冊重啟任務的資源,例如檔案名稱,服務或者是RM_UNIQUE_PROCESS結構體。
◆RMRestart
重新啟動被RmShutdown關閉的應用程式或者服務,當然,這些應用程式或者服務都需要通過RegisterApplicationRestart事先進行註冊。
◆RMShutDown
關閉應用程式或者服務。
◆RMEndSession
結束重啟任務。
添加對重啟管理器的支援
雖然Windows Vista或者windows 7系統本身提供了對重啟管理器的支援,但是對於應用程式本身,也同樣需要一些額外的工作,以完成對重啟管理器的支援。

在“MFC應用程式嚮導”的進階特性選項卡中有關於重啟管理器的選項。其中,如果僅僅選中“Support Restart Manager”選項,表示你的應用程式將僅僅支援重新啟動。換句話說,你的應用程式可以在升級或者崩潰之後重新啟動,但是無法自動開啟未關閉的文檔,無法對資料進行恢複。
如果同時選中“Reopen previously open documents”選項,它表示你的應用程式可以在重啟之後重新開啟之前開啟的文檔,也就是自動回復到當前的工作狀態。
如果選中了“Support application recover”選項,它表示你的應用程式在重新啟動後,不僅可以重新開啟之前開啟的文檔,還會嘗試恢複自動儲存的文檔。它將彈出一個任務對話方塊(Unicode版本)或者訊息框(非Unicode版本),詢問使用者是否需要恢複自動保持的文檔。如果使用者選擇“Yes”,那麼自動保持的文檔將被開啟作為當前文檔。如果使用者選擇“No”,那麼使用者最後儲存的文檔將被開啟作為當前文檔,同時自動儲存的文檔將被刪除。
這裡需要注意的是,只有文檔檢視類型的應用程式才支援“Reopen previously open documents”選項和“Support application recover”選項,對話方塊類型的應用程式只支援“Support Restart Manager”選項。
對於Visual Studio 2010中新建立的MFC應用程式,可以在應用程式嚮導中進行設定,添加對重啟管理器的支援。那麼對於很多已有的MFC應用程式,如果同樣想獲得重啟管理器的支援,應該怎麼辦呢?實際上,對於已有的MFC應用程式,要想獲得重啟管理器的支援很簡單。在新版本的MFC中,CWinApp類增加了一個新的成員變數,用於控制應用程式對重啟管理器的支援,我們只需要在應用程式的建構函式中,添加幾行代碼,按照我們的需求對其合理的初始化就可以了。
跟我們在上面所介紹的“MFC應用程式嚮導”中的選項相一致,如果你選擇的是“Support Restart Manager”,你可以在初始化函數中添加如下的代碼:
m_dwRestartManagerSupportFlags = 
AFX_RESTART_MANAGER_SUPPORT_RESTART;

 

如果你想選擇“Reopen previously open documents”,可以添加如下的代碼:
m_dwRestartManagerSupportFlags = 
AFX_RESTART_MANAGER_SUPPORT_RESTART_ASPECTS;

如果你想選擇“Support application recover”,可以添加下面這行代碼:
m_dwRestartManagerSupportFlags =
AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;

 
例如,我只想支援重啟管理器,讓軟體可以在更新後重新啟動,則可以這樣進行應用程式的初始化:
CRestartManagerDemoApp::CRestartManagerDemoApp()
{
m_bHiColorIcons = TRUE;
// support Restart Manager
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}

 

 

 

 

 

 

首先,啟動Visual Studio 2010 CTP,建立一個單文檔的應用程式CSDNRestartManager。按照我們前面的介紹,在“MFC應用程式嚮導”中選擇“Support Restart Manager”和“Reopen previously open documents”選項,以支援應用程式的重新啟動和文檔的重新開啟。並選擇editview,文件管理器。
  為了驗證重啟管理器重新開啟文檔的功能,我們在文檔中添加一些資料,這些資料將在程式重新啟動後自動被載入進來。

首先文檔的序列化,使得我們的文檔資料能夠儲存和重新載入,不懂文檔序列化的可以去google!

即首先用MFC實現一個記事本功能,這個網路上泛濫,本專家在此就不多費口舌了,

 

 

 

 

使用Restart Manassas API測試重啟管理器
  接下來,我們可以編寫一個測試程式,使用Restart Manassas API類比軟體的更新後重啟,以驗證其重啟管理器是否正常工作。
  用Visual Studio 2010 RC建立一個控制台應用程式Test,然後將其實現如下

 

 

 #include ”stdafx.h”</p><p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />DWORD dwSessionHandle = 0;<br />WCHAR wszSessionKey[CCH_RM_SESSION_KEY+1];<br />// 設定需要重啟的資源<br />LPCWSTR pwzResourcesToRestart[] ={L”C:/Users/TFSSETUP/Documents/Visual Studio 10/Projects/CSDNRestartManager/Debug/CSDNRestartManager.exe” };<br />// 建立一個重啟任務<br />if (RmStartSession(&dwSessionHandle, 0, wszSessionKey) == ERROR_SUCCESS)<br />{// 註冊資源<br />if (RmRegisterResources(dwSessionHandle, 1, pwzResourcesToRestart, 0, NULL, 0, NULL) == ERROR_SUCCESS)<br />{<br />// 關閉應用程式<br />if (RmShutdown(dwSessionHandle, RmShutdownOnlyRegistered, NULL) == ERROR_SUCCESS)<br />{// 重新啟動應用程式<br />if (RmRestart(dwSessionHandle, 0, NULL) == ERROR_SUCCESS)<br />{<br />return 0;<br />}<br />}<br />}<br />}<br />return 0;<br />}

我們首先運行CSDNRestartManager,在視圖中用鍵盤輸入向文檔中添加資料,然後保持文檔為test.txt。

現在,我們就可以運行Test重啟這個應用程式了。運行Test後,我們會看到CSDNRestartManager會被關閉然後重新開啟。同時,我們之前開啟的文檔test.txt也被重新載入,整個應用程式很快恢複到了我們之前的工作狀態。

 

 

 

 

 本文作者專著《Visual C++2010開發權威指南》即將推出,敬請關注,Visual C++2010最近技術,Windows7開發最新技術!

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.