我需要使用TSream從文件(exe或dll)中讀取VersionInfo。從TFileStream文件中讀取VersionInfo
我無法使用windows API GetFileVersionInfo,因爲我的文件位於內存(TMemoryStream),我不想將該文件寫入磁盤以獲取此信息,所以我有一些性能限制。
有人可以幫助我嗎?
我需要使用TSream從文件(exe或dll)中讀取VersionInfo。從TFileStream文件中讀取VersionInfo
我無法使用windows API GetFileVersionInfo,因爲我的文件位於內存(TMemoryStream),我不想將該文件寫入磁盤以獲取此信息,所以我有一些性能限制。
有人可以幫助我嗎?
如果原始文件數據在內存中,則Win32 API無法幫助您找到文件的版本資源。您將不得不手動讀取和解釋文件的PE標頭以查找文件的資源表,然後循環查找所需的版本資源。一旦找到它,就可以使用Win32 API VerQueryValue()
函數來訪問資源內部的一些(但不是全部)值。我會說一些,因爲VerQueryValue()
內部依賴GetFileVersionInfo()
在運行時建立的查找。但是,例如,訪問VS_FIXEDFILEINFO
結構時可以正常工作,而不必先致電GetFileVersionInfo()
。
當我將它應用於**二進制**文件時,我不喜歡術語*來解析*,*解析器*等。同時,JCL提供了一個用於訪問PE內部的類 – OnTheFly 2013-05-08 03:18:01
@ user539484關於EBML或XML/Binary?爲什麼不解析? – 2013-05-08 12:52:05
@Arioch'EBML是*解析*的結果。如果你覺得再次解析*或者解析PE頭部和/或其表格 - 你正在使用錯誤的詞* parse *。請考慮學習[定義](http://en.wikipedia.org/wiki/Parsing)和[理論](http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools) – OnTheFly 2013-05-08 13:13:11
使用Windows API執行此操作。沒有意義寫你自己的PE文件解析器。 – 2013-05-07 17:20:58
如果你不打算使用這個API,那麼你需要指定你準備使用的API的數量*。你是否也不使用TResourceStream依賴的資源定位函數?你將不得不自己編寫這個代碼,所以去做吧。你有哪些麻煩? – 2013-05-07 17:35:03