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

MFC 實現程式自我更新的批次檔技巧

     編輯:關於VC++

在軟體開發中,實現程式的自動更新功能一直是個熱門話題。雖然網路上有許多關於版本比較的討論,但核心難點在於如何妥善處理「檔案自我銷毀與替換」的問題。傳統做法通常需要準備兩個執行檔互相更新(A 更新 B,B 更新 A),流程繁瑣且不夠優雅。

核心思路:批次檔輔助更新

本文分享一種更簡潔的實作方式:利用 C++ 動態生成批次檔(.bat)來完成自我更新。具體流程如下:

  1. 程式啟動時透過 GetModuleFileName 取得自身完整路徑
  2. 使用 CFileVersion 類別比較本地版本與伺服器共享資料夾中的最新版本
  3. 若版本不同,動態建立 update.bat,內容包含刪除舊檔、複製新檔、重新啟動程式三個步驟
  4. 呼叫 ShellExecute 隱藏執行批次檔,主程式隨即退出

關鍵程式碼片段

#include "FileVersion.h"

char sPath[255];
DWORD dwSize = 255;
GetModuleFileName(NULL, sPath, dwSize); // 取得當前執行檔完整路徑

CFileVersion fv;
fv.Open((LPTSTR)sPath);
CString szcurfileVer = fv.GetFileVersion();
CString szcurprdctVer = fv.GetProductVersion();
fv.Close();

CString szServerFile = _T("\\\\主機名\\共享路徑\\exe檔案"); // 更新來源路徑

if (fv.Open(szServerFile)) {
    CString szsrcfileVer = fv.GetFileVersion();
    CString szsrcprdctVer = fv.GetProductVersion();
    fv.Close();

    // 版本不一致時觸發更新
    if (szcurfileVer != szsrcfileVer || szcurprdctVer != szsrcprdctVer) {
        CStdioFile f(_T("C:\\update.bat"), CFile::modeCreate | CFile::modeWrite);
        f.WriteString(_T("del "));
        f.WriteString(sPath);
        f.WriteString(_T("\n"));                    // 刪除舊檔
        f.WriteString(_T("copy ") + szServerFile + _T(" "));
        f.WriteString(sPath);
        f.WriteString(_T("\n"));                    // 複製新檔
        f.WriteString(sPath);
        f.WriteString(_T("\n"));                    // 重新啟動更新後的程式
        f.Close();

        ShellExecute(NULL, NULL, _T("C:\\update.bat"), NULL, NULL, SW_HIDE);
        exit(0); // 退出主程式,讓批次檔接手後續工作
    }
} else {
    AfxMessageBox(_T("獲取更新檔案失敗,請確認網路連線!"));
}

優缺點分析

優點:無需額外的更新程式,單一執行檔即可完成自我更新;邏輯直觀,易於維護。

注意事項:

  • 網路路徑需使用雙反斜線(\\\\)
  • 批次檔執行權限需足夠(建議以管理員身分執行主程式)
  • 若需更新多個檔案,可在批次檔中追加多行 copy 指令

這個技巧適用於 MFC 應用程式,特別適合內部部署環境,透過共享資料夾即可實現輕量級的自動更新機制。

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