版本信息是通过rc.exe编译器编译在资源里面的,它的格式大概是这样
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080403a8"
BEGIN
VALUE "CompanyName", "TODO: <公司名>"
VALUE "FileDescription", "TODO: <文件说明>"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "QQLike2.exe"
VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有权利。"
VALUE "OriginalFilename", "QQLike2.exe"
VALUE "ProductName", "TODO: <产品名>"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 936
END
END
BEGIN上面的部分是版本信息的固有属性,BEGIN里面叫做信息块
要获取文件中的版本信息其实很简单
1.通过GetFileVersionInfoSize函数检查文件中是否有版本信息
invoke GetFileVersionInfoSize,addr szFile,NULL
2.通过GetFileVersionInfo来获取版本信息
invoke GetFileVersinoInfo,add szFile,NULL,sizeof dbVerInfo,addr dbVerInfo
3.通过VerQueryValue来“解释”上面返回的字符串
invoke VerQueryValue,addr dbVerInfo,addr szRoot,addr lpBuffer,addr dwLen
这个函数会返回一个VS_FIXEDFILEINFO结构,这个结构中有定义的固定属性内容。