所謂pe檔案版本資訊,本文最後有幅圖,看了就很明了了。
為exe/dll新增版本資訊,總體思路很簡單,就是自行生成特定格式的資源資料,呼叫win32api函式updateresource將該資料寫入檔案中即可(或者由編譯器在輸出檔案時插入該資料)。
關鍵是這一段資料的生成,相對比較複雜,而且繁索,不小心就還容易出錯。這是一塊純資料(raw data),格式比較複雜,結構體巢狀n層,而這些個結構體的結構又不是固定不變的,用c語言根本無法描述,msdn中也還要同時借助於自然語言才能表達。首先,最頂層是乙個vs_versioninfo結構,它包含乙個成員vs_fixedfileinfo,並且有兩個子成員stringfileinfo和varfileinfo;其中,stringfileinfo要包含乙個子成員stringtable(外加stringtable內n個子成員string),varfileinfo要包含子成員var。以上提到的各子成員,都分別是乙個格式不固定的結構體,組織這些資料時必須處理位元組對齊問題。
無論如何,msdn中的資料相對完整,細心耐心一些,總是可以完成這個工作。
我之所以奮戰至深夜,是因為遇到幾個一時無法解決的細節問題。寫在這裡,希望對其他人有點參考價值。
第乙個問題:必須存在「檔案版本」
stringfileinfo結構中的stringtable結構中必須包含乙個key為「fileversion」的string,否則,設定的其它所有版本資訊項一定不會顯示出來。
這也許是微軟的bug吧,或者說是msdn上的疏漏,沒有寫明。這個問題真是可恨,我(liigo)當時測試只是隨便選了幾項(如companyname,productname)寫入,結果死活顯示不出來,把我的**檢查了一遍又一遍,與msdn中的說明逐一核對,最後死活也想不到是因為少寫了fileversion這麼一項資料。我奮戰至深夜,絕大部分時間用於總結出這麼一條令人沮喪的沉痛經驗!
第二個問題:「語言」
stringfileinfo結構中的stringtable結構中的szkey成員,表示語言資訊,msdn中的說明不是很具體,我對比參考其它已經寫入版本資訊的exe,得知l"080404b0"表示「中文(中國)」,l"040904e4"表示「英語(美國)」。(當然還要相應的設定varfileinfo結構中的var結構中的value數值。如果沒有varfileinfo結構,或varfileinfo.var.value值不對,版本資訊也不會顯示出來。)
第三個問題:位元組對齊
以上提到的所有結構體中,通常都有一到兩個padding成員,用於將下乙個成員對齊到32位元組位邊界,這在msdn中說明的比較明確。我(liigo)要特別指出的是,在string結構中,msdn定義中只在value成員之前有乙個padding,用於將value對齊到32位邊界,其實在value成員之後也應該有乙個padding。因為多個string是鄰接存放的,前乙個string.value可能會導致後乙個string.value無法對齊到32位邊界,這裡需要特別注意。另,msdn中明確說明,vs_versioninfo中的wlength成員「不包含」本結構及其子結構的所有padding的長度,而我實際測試中發現,即使包含了所有padding的長度,結果也是正確的,——去掉所有padding的長度是需要額外的處理的,我這裡偷懶了。
第四個問題:vs_fixedfileinfo中的無詳細文件成員
為EXE DLL新增版本資訊,奮戰至深夜
所謂pe檔案版本資訊,本文最後有幅圖,看了就很明了了。為exe dll新增版本資訊,總體思路很簡單,就是自行生成特定格式的資源資料,呼叫win32api函式updateresource將該資料寫入檔案中即可 或者由編譯器在輸出檔案時插入該資料 關鍵是這一段資料的生成,相對比較複雜,而且繁索,不小心就...
為EXE DLL新增版本資訊,奮戰至深夜
所謂pe檔案版本資訊,本文最後有幅圖,看了就很明了了。為exe dll新增版本資訊,總體思路很簡單,就是自行生成特定格式的資源資料,呼叫win32api函式updateresource將該資料寫入檔案中即可 或者由編譯器在輸出檔案時插入該資料 關鍵是這一段資料的生成,相對比較複雜,而且繁索,不小心就...
給Delphi程式新增版本資訊
我們在用delphi編譯完程式,準備發布產品時,總希望隨產品發布個性資訊以標示產品的 以及開發者等資訊,就像windows的程式一樣,使我們一看屬性就知道他是微軟的產品,這些在delphi中是如何實現的呢?下面我就來給大家演示和說明給exe,dll檔案新增版本資訊的方法。第一,給exe檔案新增版本資...