天天看點

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

為了提高使用者體驗,讓使用者用起來感覺比較爽,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 StudioC++新特性--MFC王者歸來(3)MFC新功能-基于windows7的重新開機管理災難恢複

首先,啟動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”

int _tmain(int argc, _TCHAR* argv[])

{

DWORD dwSessionHandle = 0;

WCHAR wszSessionKey[CCH_RM_SESSION_KEY+1];

// 設定需要重新開機的資源

LPCWSTR pwzResourcesToRestart[] ={L”C:/Users/TFSSETUP/Documents/Visual Studio 10/Projects/CSDNRestartManager/Debug/CSDNRestartManager.exe” };

// 建立一個重新開機任務

if (RmStartSession(&dwSessionHandle, 0, wszSessionKey) == ERROR_SUCCESS)

{// 注冊資源

if (RmRegisterResources(dwSessionHandle, 1, pwzResourcesToRestart, 0, NULL, 0, NULL) == ERROR_SUCCESS)

{

// 關閉應用程式

if (RmShutdown(dwSessionHandle, RmShutdownOnlyRegistered, NULL) == ERROR_SUCCESS)

{// 重新啟動應用程式

if (RmRestart(dwSessionHandle, 0, NULL) == ERROR_SUCCESS)

{

return 0;

}

}

}

}

return 0;

}

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

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

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

繼續閱讀