65.9K
CodeProject 正在变化。 阅读更多。
Home

如何开发支持重启管理器应用程序:测试用例 30

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.17/5 (7投票s)

2007年8月14日

3分钟阅读

viewsIcon

63472

downloadIcon

435

在这里,我将展示如何实现 Windows Vista 的重启管理器。

引言

微软在 Windows Vista 中引入了一些不错的功能,如重启管理器 (Restart Manager)、窗口
错误报告、文件/文件夹和注册表虚拟化。

背景

在本文中,我将详细解释重启管理器。此外,撰写本文的主要目的是针对
测试用例 30。因此,它将帮助那些即将
参与 Windows Vista 徽标认证过程的开发者。本文将帮助他们解决测试用例 30。

首先让我介绍一下重启管理器。

重启管理器

  1. 什么是重启管理器?
    1. 当我们安装任何软件或更新现有软件时,有时
      某些软件在安装过程中需要重启系统。因此系统会
      重启,用户必须再次打开所有正在运行的应用程序,这对
      终端用户来说非常不便。
    2. 现在,为了解决这种情况,Windows Vista 的重启管理器将维护
      应用程序的状态,并根据
      应用程序设置关闭并重新启动应用程序。
  1. 为什么我们的应用程序需要重启管理器?
    1. 为了使应用程序在 Windows Vista 中正常运行,开发者必须
      开发支持重启管理器(RM Aware)的应用程序。因为微软已经启动了 WindowsVista
      徽标认证计划,以使应用程序更可靠,并与
      Windows Vista 兼容。
  1. 重启管理器 API 简介
    1. 重启管理器 API。

i. rstrtmgr.dll 用于 RM

ii. RM API 列表

1. RMStartSession

a. 启动新的重启管理器会话。

2. RMGetList

a. 安装程序使用此函数获取受注册资源影响的所有应用程序及其当前状态的列表。
资源及其当前状态的列表。

3. RMRegisterResources

a. 将资源(如文件名、服务短名称或
RM_UNIQUE_PROCESS
结构)注册到重启管理器会话。

4. RMRestart

a. 重启已被 RmShutdown 函数关闭并已使用 RegisterApplicationRestart 注册为重启的应用程序和服务。

5. RMShutDown

a. 启动应用程序和服务的关闭。

6. RMEndSession

a. 结束重启管理器会话。

使用 VB.Net 实现 API

这里我将为一些 API 编写示例代码

<DllImport("rstrtmgr.dll", CharSet:=CharSet.Auto)> _ 
Friend Shared Function RmStartSession(ByRef pSessionHandle As UInteger, _
 ByVal dwSessionFlags As Integer, ByVal strSessionKey As StringBuilder) As Integer 
End Function 

<DllImport("rstrtmgr.dll", CharSet:=CharSet.Auto)> _ 
Friend Shared Function RmRegisterResources(ByVal pSessionHandle As UInteger, _
 ByVal nFiles As Integer, ByVal rgsFilenames As String(), ByVal nApplications As Integer,_
 ByVal rgApplications As RM_UNIQUE_PROCESS(), ByVal nServices As Integer,_

 ByVal rgsServiceNames As String()) As Integer 

End Function                               

<DllImport("rstrtmgr.dll", CharSet:=CharSet.Auto)> _ 
Friend Shared Function RmShutdown(ByVal pSessionHandle As UInteger, _
 ByVal dwSessionFlags As UInteger, ByVal fnStatus As IntPtr) As Integer 
End Function 

<DllImport("rstrtmgr.dll", CharSet:=CharSet.Auto)> _ 
Friend Shared Function RmRestart(ByVal pSessionHandle As UInteger, _
 ByVal dwRestartFlags As UInteger, ByVal fnStatus As IntPtr) As Integer 
End Function 

<DllImport("rstrtmgr.dll", CharSet:=CharSet.Auto)> _ 
Friend Shared Function RmEndSession(ByVal pSessionHandle As UInteger)_
 As Integer 
End Function

要获取重启管理器 API 的完整详细信息。请查看以下 URL

http://msdn2.microsoft.com/en-us/library/aa373649.aspx

  1. 如何开发支持重启管理器的应用程序?

要在我们的应用程序中实现 RM,我们必须使用 kernel32.dll API。我们不需要
在应用程序中实现 RM API,但只需实现 kernel32.dll 中的一个 API 即可将我们的应用程序
应用程序注册到重启管理器。
“RegisterApplicationRestart”

这是实现 kernel32.dll API 的代码

 
<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _ 
Public Shared Function RegisterApplicationRestart(ByVal pszCommandline_
 As String, ByVal dwFlags As Integer) As UInteger 

End Function

注册应用程序的活动实例以进行重启。

HRESULT WINAPI RegisterApplicationRestart( PCWSTR pwzCommandline, DWORD dwFlags );

点击以下链接获取此函数参数的详细信息

http://msdn2.microsoft.com/EN-US/library/aa373347.aspx

现在,从应用程序主类或在 Form load 事件中调用此函数。

但在将应用程序注册到重启管理器之前,我们必须检查操作系统
版本,因为 Windows XP 和以前的操作系统版本不支持 RM API。因此,当您尝试
注册 RegisterApplicationRestart 时,可能会引发错误。

要克服这个问题,您只需调用此函数。

 
Public Function RunningVistaOrLater() As Boolean 
      Return System.Environment.OSVersion.Version.Major > 5 
End Function

Private Sub frmRMAware_Load(ByVal sender As System.Object,_
 ByVal e As System.EventArgs) Handles MyBase.Load
    '======= Check application is Running on Vista OR or Later Version
   If RunningVistaOrLater Then
         '========== RegisterApplication For RM
         RegisterApplicationRestart("Test", 0)
    End If
End Sub

现在在下一步,我们必须重写 WndProc 方法来监听消息,以便

Windows 消息 十六进制 十进制
WM_QUERYENDSESSION 0x0011 17
ENDSESSION_CLOSEAPP 0x1 1

这是监听 WM 消息的代码

 
Private WM_QUERYENDSESSION As Int32 = 17 
Private ENDSESSION_CLOSEAPP As Int32 = 1 
Private WM_ENDSESSION As Int32 = 22 

Protected Overloads Overrides Sub WndProc(_
 ByRef msg As System.Windows.Forms.Message) 

         MyBase.WndProc(msg) 
         If msg.Msg = WM_QUERYENDSESSION Or msg.Msg = WM_ENDSESSION Then 
            If msg.LParam.ToString = ENDSESSION_CLOSEAPP Then 
                  '; Here Write Code to Save application State, when its 
                   'going to shutdown or restart 
            End If 
         End If 
End Sub

  1. 我们如何判断我的应用程序是否支持重启管理器?
    1. 要检查应用程序是否支持重启管理器。您需要 rmtool.exe。
    2. 这是相关命令:

i. rmtool.exe –p dwPID –S –R

1. dwPID = 应用程序的进程 ID

2. –S = 关闭应用程序

3. –R = 关闭后重启应用程序

要获取有关 RMTOOL 的所有参数,请查看帮助命令以获取 RMTool 帮助。

(注意:请务必使用精确的命令,即 –S 和 –R 必须大写。)

结论

通过这种方式,我们可以将 RM 整合到我们的应用程序中,以开发支持 RM 的
应用程序。

有用链接

http://channel9.msdn.com/Showpost.aspx?postid=251492
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx

如果您需要解决 Windows Vista 徽标计划的任何测试用例,请随时与我联系。

© . All rights reserved.