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

取得 EXE/DLL/OCX 檔案版本資訊的 Win32 API 實作

     編輯:關於C++

安裝程式、自動更新器常需比對檔案版本以決定是否覆蓋。單純比對修改時間不可靠,Win32 提供版本資源 API 可精確讀取內嵌的版本資訊區塊。

核心 API 流程

  1. GetFileVersionInfoSize:取得版本資源大小,配置緩衝區。
  2. GetFileVersionInfo:將版本資源讀入緩衝區。
  3. VerQueryValue:查詢特定子區塊。
    • 先查 \VarFileInfo\Translation 取得語言/代碼頁(如 040904B0)。
    • 組合字串 \StringFileInfo\<語言代碼頁>\FileVersion 查詢具體欄位。

C++Builder 範例:讀取檔案版本並顯示於 Edit 控制項

void __fastcall TForm1::Button1Click(TObject *Sender) {
    DWORD dummy, size = GetFileVersionInfoSize(Edit1->Text.c_str(), &dummy);
    if (!size) return;
    char *buf = new char[size];
    GetFileVersionInfo(Edit1->Text.c_str(), 0, size, buf);

    char *val; UINT vlen;
    VerQueryValue(buf, "\\VarFileInfo\\Translation", (void**)&val, &vlen);
    // val 指向 WORD language, WORD codepage
    AnsiString block = "\\StringFileInfo\\" +
        IntToHex(*(WORD*)val, 4) + IntToHex(*(WORD*)(val+2), 4) +
        "\\FileVersion";

    VerQueryValue(buf, block.c_str(), (void**)&val, &vlen);
    Edit1->Text = AnsiString(val).SetLength(vlen - 1); // 移除結束 null
    delete[] buf;
}

可查詢的標準字串欄位

CompanyName, FileDescription, FileVersion, InternalName, LegalCopyright, OriginalFilename, ProductName, ProductVersion

將上述範例中的 FileVersion 替換即可取得對應資訊。適用於安裝前檢查、軟體資產管理、相依性驗證等自動化流程。

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