安裝程式、自動更新器常需比對檔案版本以決定是否覆蓋。單純比對修改時間不可靠,Win32 提供版本資源 API 可精確讀取內嵌的版本資訊區塊。
GetFileVersionInfoSize:取得版本資源大小,配置緩衝區。GetFileVersionInfo:將版本資源讀入緩衝區。VerQueryValue:查詢特定子區塊。
\VarFileInfo\Translation 取得語言/代碼頁(如 040904B0)。\StringFileInfo\<語言代碼頁>\FileVersion 查詢具體欄位。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 替換即可取得對應資訊。適用於安裝前檢查、軟體資產管理、相依性驗證等自動化流程。