您有一个用于解析 EXE 文件的现成模块:http://code.google.com/p/pefile/ http://code.google.com/p/pefile/
您可以使用以下代码来阅读它:
import pefile
pe = pefile.PE(r'C:\Windows\notepad.exe')
FileVersion = pe.FileInfo[0].StringTable[0].entries['FileVersion']
ProductVersion = pe.FileInfo[0].StringTable[0].entries['ProductVersion']
如您所见,Windows EXE(和 DLL)文件存储两种不同类型的版本:FileVersion 和 ProductVersion。很多时候它们是相同的,但有时它们可能不同 - 这一切都取决于真正制作 EXE 的人。
Edit:
让事情变得更复杂的是,PE 字符串表中的这两个字符串并不是 Windows 编译器保存版本的唯一位置。 EXE 中还存储了两个附加的 FileVersion 和 ProductVersion 值,只不过它们存储为 32 位整数对,每个值又依次分解为两个 16 位整数(Windows API 中的 WORD)。总之,每个版本值(FileVersion 和 ProductVersion)都有 4 个 16 位字,表示版本的点分隔部分。您也可以使用 pefile 获取它们:
pe = pefile.PE(r'C:\Windows\notepad.exe')
FileVersionLS = pe.VS_FIXEDFILEINFO.FileVersionLS
FileVersionMS = pe.VS_FIXEDFILEINFO.FileVersionMS
ProductVersionLS = pe.VS_FIXEDFILEINFO.ProductVersionLS
ProductVersionMS = pe.VS_FIXEDFILEINFO.ProductVersionMS
FileVersion = (FileVersionMS >> 16, FileVersionMS & 0xFFFF, FileVersionLS >> 16, FileVersionLS & 0xFFFF)
ProductVersion = (ProductVersionMS >> 16, ProductVersionMS & 0xFFFF, ProductVersionLS >> 16, ProductVersionLS & 0xFFFF)
print 'File version: %s.%s.%s.%s' % FileVersion
print 'Product version: %s.%s.%s.%s' % ProductVersion
可是等等!这还不是全部:您至少还有一个地方可以查找版本:在另一个称为 OPTIONAL_HEADER 的结构中,您可以找到另外两个值,称为 MajorImageVersion 和 MinorImageVersion。它们代表整个版本的前两个部分,因此 ProductVersion 或 FileVersion 为 6.1.7600.150 的文件通常会有 MajorImageVersion 为 6 和 MinorImageVersion 为 1。您可以使用以下命令获取它们pe.OPTIONAL_HEADER.MajorImageVersion
and pe.OPTIONAL_HEADER.MinorImageVersion
.
所有这些值(5 个不同的值,如果我数正确的话)通常是等效的(如果您忽略字符串表中的值有时具有的额外自由格式字符串值),但看到 FileVersions 和 ProductVersions 不相同的情况很常见,并且您还应该准备好迎接其他惊喜。