首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 實現程式自我重啟:CreateProcess 在 OnClose 中啟動新實例

     編輯:VC 教學

某些場景 (配置生效、插件更新、語言切換、崩潰恢復) 需要程式「自我重啟」。核心邏輯:設置重啟標誌 → 發送關閉訊息 → OnClose 中判斷標誌 → CreateProcess 啟動自身新實例 → 退出當前進程。

完整實現代碼

1. 全域重啟標誌

// 全域或 CWinApp 成員
BOOL g_bRestartRequested = FALSE;

2. 觸發重啟 (如按鈕、選單項)

void CMyDlg::OnBtnRestart() {
    g_bRestartRequested = TRUE;
    PostMessage(WM_CLOSE); // 非同步關閉,讓訊息隊列處理完畢
}

3. OnClose 中執行重啟邏輯

void CMyDlg::OnClose() {
    if (g_bRestartRequested) {
        // 1. 獲取自身完整路徑
        TCHAR szPath[MAX_PATH];
        GetModuleFileName(NULL, szPath, MAX_PATH); // 含 .exe

        // 2. 啟動資訊
        STARTUPINFO si = { sizeof(si) };
        PROCESS_INFORMATION pi = {0};

        // 3. 創建新進程 (同參數、同目錄、正常優先級)
        BOOL ok = CreateProcess(
            szPath,           // lpApplicationName
            NULL,             // lpCommandLine (繼承原參數需自行傳遞)
            NULL, NULL,       // Process/Thread Security
            FALSE,            // bInheritHandles
            NORMAL_PRIORITY_CLASS,
            NULL,             // Environment (繼承)
            NULL,             // Current Directory (繼承)
            &si, &pi
        );

        if (ok) {
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
        g_bRestartRequested = FALSE; // 重置
    }
    CDialog::OnClose(); // 基類處理銷毀
}

進階考量

  1. 命令列參數傳遞: CreateProcess 第二參數 lpCommandLine 若為 NULL,新進程無參數。需保留原 __argv/GetCommandLine() 並傳遞:CreateProcess(szPath, GetCommandLine(), ...)。
  2. 單實例保護: 若程式有單實例鎖 (Mutex),重啟前需釋放鎖,否則新實例啟動即檢測到舊實例仍在運行而退出。可在 OnClose 釋放 Mutex 後再 CreateProcess。
  3. 管理員權限 (UAC): 若原進程以管理員運行,CreateProcess 繼承提權;若需提權重啟,需 SHELLEXECUTEINFO + lpVerb = "runas"。
  4. 資料保存: 重啟前務必 SaveConfig()、FlushLog() 等。
  5. 無主視窗 (服務/控制台): 同樣適用,在主函數返回前判斷標誌 CreateProcess。

替代方案:Restart Manager (Vista+)

Windows Restart Manager API (RmStartSession, RmRegisterResources, RmShutdown, RmRestart) 提供系統級重啟支援 (含檔案鎖釋放、服務重啟),適用於安裝程式/自動更新器,但 API 較複雜。簡單自我重啟用 CreateProcess 即夠。

此模式簡潔可靠,廣泛用於桌面應用的「立即生效」重啟需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved