如何创建可自重启的应用程序






4.71/5 (28投票s)
本文描述了如何为您的Win32应用程序添加重启支持。
![]() |
步骤 1. 重启前的应用程序 |
![]() |
步骤 2. 重启中的应用程序 |
![]() |
步骤 3. 重启后的应用程序 |
引言
在某些情况下,您的应用程序必须重启才能应用一些更改。例如,您可能希望在下载了较新版本的文件或更改了应用程序的UI语言后重启应用程序。对于用户来说,不必手动重启应用程序非常方便。最好的方法是询问用户是否需要立即或稍后重启应用程序。
在本文中,我将描述一种用几行代码完成此任务的简单方法。
使用代码
使用重启代码非常简单。
首先,在您的"stdafx.h"中包含"RestartAPI.h",并在您的VC项目中添加"RestartAPI.cpp"。
第二步是修改您的main
或WinMain
函数,如下所示。另一种方法是将重启初始化代码添加到您的应用程序启动点,并将重启完成代码添加到退出点,例如WTL应用程序中的PreMessageLoop
/PostMessageLoop
。以下是修改后的WinMain
函数的示例。
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) { // Initialize restart code // Check if this instance is restarted and // wait while previos instance finish if (RA_CheckForRestartProcessStart()) RA_WaitForPreviousProcessFinish(); // // // Your WinMain Code here // // // Finish restarting process if needed RA_DoRestartProcessFinish(); return 0; }
第三步是确定您要初始化应用程序重启的点。在附带的示例中,此点是“重启我!”按钮的单击处理程序。要重启应用程序,您必须调用RA_ActivateRestartProcess
函数并终止您的应用程序。
LRESULT CMainDlg::OnBnClickedRestart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { // Initialize restart proceess if (!RA_ActivateRestartProcess()) { ::MessageBox(NULL, _T("Something Wrong"), _T("Restart App"), MB_OK|MB_ICONEXCLAMATION); return 0; } // Terminate application. CloseDialog(IDC_RESTART); return 0; }
简短的函数参考
宏
重启应用程序的命令行开关
#define RA_CMDLINE_RESTART_PROCESS TEXT("--Restart")
您可以根据您的目的重新定义命令行开关。重启的应用程序将使用此开关启动
#define RA_MUTEX_OTHER_RESTARTING TEXT("YOUR_RESTART-MUTEX_NAME")
互斥体唯一名称
命名互斥体用于等待进程的第一个实例终止。互斥体名称必须是唯一的。为此,您可以使用GUID来定义互斥体名称,如下所示
#define RA_MUTEX_OTHER_RESTARTING TEXT("APPRESTART-E476AE82-AA92-11DA-ACE4-006098EFC07C")
您可以根据您的目的重新定义互斥体名称。
函数
BOOL RA_CheckProcessWasRestarted();
如果进程已重启,则返回TRUE
。
BOOL RA_CheckForRestartProcessStart();
检查进程的命令行以获取重启开关。调用此函数以检查它是否是重启实例。
BOOL RA_WaitForPreviousProcessFinish();
等待进程的上一个实例完成。
BOOL RA_DoRestartProcessFinish();
当进程完成时调用它。
BOOL RA_ActivateRestartProcess();
当您需要重启应用程序时,调用此函数。使用命令行RA_CMDLINE_RESTART_PROCESS
启动进程的另一个副本。在调用RA_ActivateRestartProcess
之后,您必须关闭您的应用程序的活动实例。
下载次数
演示项目
演示项目包括一个示例WTL对话框应用程序,它演示了如何使用重启API。从屏幕截图中,您可以看到应用程序工作的一些阶段。
第一个屏幕显示应用程序正常启动。在第二个屏幕中,用户单击了“重启我!”按钮,您会看到伪终止进度。如果您在那一刻运行任务管理器,您将看到两个RestartableApp.exe实例。在最后一个屏幕中,应用程序在重启后处于正常状态。
源文件
源文件包括"RestartAPI.h"和"RestartAPI.cpp",它们可以在您的Win32应用程序中单独使用。
历史
- 2006年8月10日
- 首次公开发布。