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

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

2006 年 8 月 15 日

CPOL

3分钟阅读

viewsIcon

116628

downloadIcon

4649

本文描述了如何为您的Win32应用程序添加重启支持。

Application Before Restart
步骤 1. 重启前的应用程序
Application While Restarting
步骤 2. 重启中的应用程序
Application After Restart
步骤 3. 重启后的应用程序

引言

在某些情况下,您的应用程序必须重启才能应用一些更改。例如,您可能希望在下载了较新版本的文件或更改了应用程序的UI语言后重启应用程序。对于用户来说,不必手动重启应用程序非常方便。最好的方法是询问用户是否需要立即或稍后重启应用程序。

在本文中,我将描述一种用几行代码完成此任务的简单方法。

使用代码

使用重启代码非常简单。

首先,在您的"stdafx.h"中包含"RestartAPI.h",并在您的VC项目中添加"RestartAPI.cpp"。

第二步是修改您的mainWinMain函数,如下所示。另一种方法是将重启初始化代码添加到您的应用程序启动点,并将重启完成代码添加到退出点,例如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日
    • 首次公开发布。
© . All rights reserved.