在應用層面上,程序員可以通過保存在應用程序文件或動態鏈接庫文件中的版本信息判斷一個文件是否應該被安裝,並確定當前安裝文件的沖突。在文件有了版本信息這個屬性後,我們編寫的程序就能夠實現以下功能:
1. 避免在新版本的組件上安裝舊版本的相同組件;
2. 在多語言系統環境中,操作系統根據文件版本信息裡提供的語言信息在啟動程序時決定使用的正確語言;
3. 可以防止在不同的路徑下安裝多個文件的拷貝;
4. 應用程序在運行時,便能判斷文件的版本是否正確;
5. 在應用程序的關於對話框中顯示可執行文件的版本號;
6. 在線升級程序可以判斷一個文件是否因為版本過舊,從而進行必要的文件升級。
因為Windows系統在設計上的先天缺陷,其使用的FSO並不支持文件的版本信息功能。為了能對文件的版本信息進行管理,微軟在Platform SDK(平台軟件開發工具包)中通過API(可編程接口)的方式為軟件開發人員提供了管理版本信息的方法。這些API是GetFileVersionInfo、GetFileVersionInfo、VerFindFile、VerInstallFile和VerQueryValue,它們被存放在Windows系統目錄下一個被命名為VERSION.DLL的動態鏈接庫文件中。
在Windows系統中任何可以包含Windows資源的文件都可以包含版本信息,比如動態鏈接庫文件、可執行文件、字體文件等。版本信息被包裝成一個VERSIONINFO結構的資源,通過編譯器打包進這些文件中。
本文試圖通過分別講解這些API的使用方法,向讀者介紹在Delphi中通過編程的方法,怎樣實現在運行時動態獲取程序文件版本信息的功能。
一、幾個重點版本信息函數的使用方法 在Windows操作系統中采用語言標識符來區別不同的自然語言,語言標識符是一個32位的無符號整數,一個數值唯一對應一種自然語言。因此,除了前面列出的五個函數外,在我們編寫程序的時候還會經常使用到VerLanguageName函數,通過調用這個函數,我們的程序便能夠自由的在用整數表示的語言標識符和用字符串表示的語言名稱之間進行轉換。
以下便是用於處理版本信息函數的完整列表。須要注意的是:1. 在Windows NT 3.51或更早版本的操作系統中,版本信息函數不能操作16位的Windows文件像(File Image);2. 在Windows 95/98/Me/NT4/2000操作系統中,這些函數同時可以操作16位和32位兩種文件像;3. 在Windows XP操作系統中,這些函數同時可以操作16位、32位和64位共三種文件像。
[插入表格1]
在這篇文章中,我們將著重介紹GetFileVersionInfo、GetFileVersionInfoSize、VerLanguageName和VerQueryValue這四個函數的使用方法。在實際應用時,其余的兩個函數很少使用,因此不作為重點內容進行介紹。
1.1. GetFileVersionInfo函數
GetFileVersionInfo函數被用來獲取包含在指定文件中的版本信息。其Delphi函數聲明如下:
function GetFileVersionInfo(
lptstrFilename: PChar; // 文件名
dwHandle: DWord; // 忽略
dwLen: DWord; // 緩沖區大小
lpData: Pointer // 版本信息緩沖區
): BOOL; stdcall;
參數說明:
lptstrFilename,一個以NULL結束字符串,它指定了期望從中獲取版本詳細的文件名。如果文件名不包含完整路徑,函數將使用LoadLibrary函數的默認搜索次序進行搜索。在Windows 95/98/Me操作系統中路徑名不能超過126個字符。
dwHandle,這個參數沒有使用,將被忽略。
dwLen,請先調用GetFileVersionInfoSize函數確定文件版本信息的字節數大小。dwLen必須等於或大於這個值。如果lpDate指向的緩沖區空間不夠,函數將根據實際大小裁減出文件的版本信息。
lpData,指向一個用於保存函數調用後返回的文件版本信息的緩沖區。
如果函數調用成功,它將返回True;否則返回False。可通過GetLastError函數得到擴展的錯誤信息。
在調用GetFileVersionInfo函數前必須先調用GetFileVersionFileSize。為了從文件版本信息中獲取有用信息,必須使用VerQueryValue函數。
1.2. GetFileVersionInfoSize函數
GetFileVersionInfoSize函