vs2010的MFC新功能:基于windows7的重启管理灾难恢复

为了提高用户体验,让用户用起来感觉比较爽,MicrosoftWindows Vista系统中首先引入了重启管理器(Restart Manager)

 

就类似office2007的自动保存功能,一旦出了故障,可以恢复自己的工作成果,不至于让自己工作成果因为故障而丢失。

 

它可以帮助应用程序维护其当前运行状态,当软件更新后需要重新启动,或者是遇到非常严重的问题崩溃后,可以重新启动软件并且恢复到软件的当前工作状态。更重要的是,它还可以恢复自动保存的软件数据状态,尽量保证用户数据的安全。有了重启管理器,软件就可以很快地从灾难中恢复过来,实现快速“灾后重建”。

 

微软平台产品及服务部门总裁Jim Allchineweek透露,如果一个应用程序或操作系统本身需要更新,安装器就会唤出Restart ManagerRestart Manager负责查看是否能清除操作系统的相关部分,以更新它。如果可以的话,系统就不必重新启动了。

 

 Visual c++2010MFC增加了Restart Manager支持。

 

重启管理器主要应用在下面两个方面:

 

◆软件更新

很多时候,软件或者操作系统升级后,需要重新启动才可以生效。在这种情况下,我们就可以使用重启管理器自动关闭真正运行的软件,然后进行更新,更新完成后自动重新启动软件,并且恢复到软件当前的工作状态。这将使得软件的更新更加流畅和智能。

 

◆软件灾难恢复

当软件遇到严重错误,进程崩溃的时候,可以使用重启管理器重新启动软件,恢复软件自动保持的数据,让软件可以快速地从灾难中恢复过来。

为了支持重启管理器,微软提供了一套Restart Manassas API函数来完成这些工作。这些函数定义在头文件中,如果你的应用程序想使用这套API,需要引用rstrtmgr.librstrtmgr.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”

 

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也被重新加载,整个应用程序很快恢复到了我们之前的工作状态。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9899936/viewspace-666739/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9899936/viewspace-666739/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值