我理解第一个参数必须是GetFileVersionInfo()的结果。
第三个和第四个参数是目标缓冲区和大小。
那么第二个参数lpSubBlock是什么呢?
提前感谢您的帮助。
当您通过资源编辑器查看版本信息时,您可能会注意到有一个初始部分包含FILEVERSION、PRODUCTVERISON等,然后是一个或多个包含特定语言设置的块。
VS_VERSION_INFO VERSIONINFO
FILEVERSION 5,0,0,0
PRODUCTVERSION 5,0,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", ""
VALUE "FileVersion", "5, 0, 0, 0"
VALUE "ProductName", ""
VALUE "ProductVersion", "5, 0, 0, 0"
END
BLOCK "000004b0"
BEGIN
VALUE "CompanyName", ""
VALUE "FileVersion", "5, 0, 0, 0"
VALUE "ProductName", ""
VALUE "ProductVersion", "5, 0, 0, 0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0, 1200, 0x409, 1200
END
END
要获取一个不带语言特定细节的VS_FIXEDFILEINFO,请使用以下方法
VS_FIXEDFILEINFO *versionInfo;
PUINT versionInfoSize;
VerQueryValue(buffer.get(), TEXT("\\"), (void**) &versionInfo, &versionInfoSize))
要找出支持的语言,请使用
Var *translationsInfo;
PUINT transaltionInfoSize;
VerQueryValue(buffer.get(), TEXT("\\VarFileInfo\\Translation"), (void**) &translationsInfo, &transaltionInfoSize))
要获取特定语言版本的详细信息,请使用以下方法
StringTable *stringTable;
PUINT stringTableSize;
std::wstring path( L"\\StringFileInfo\\" );
path += L"040904b0"; // get this value from the language support list
path += L"\\FileVersion";
VerQueryValue(buffer.get(), path.c_str(), (void**) &stringTable, &stringTableSize))
它必须是一个字符串,其格式可以在此处找到:
http://www.hep.wisc.edu/~pinghc/books/apirefeng/v/verqueryvalue.html
下面是另一个使用示例(VB易于阅读):
http://support.microsoft.com/kb/160042
您还可以查看这篇完整的CodeProject文章,其中包含C++的实际示例:
http://www.codeproject.com/KB/cpp/GetLocalVersionInfos.aspx
关于检索版本信息的另一篇文章:
http://www.microsoft.com/msj/0498/c0498.aspx