您应该为 Windows API 调用 VerQueryValue 提供哪些参数
Posted
技术标签:
【中文标题】您应该为 Windows API 调用 VerQueryValue 提供哪些参数【英文标题】:What Arguments are you supposed to give to the Windows API call VerQueryValue 【发布时间】:2008-11-25 22:48:57 【问题描述】:我知道第一个参数必须是 GetFileVersionInfo() 的结果。
第三个和第四个是目标缓冲区和大小
第二个参数 lpSubBlock 是什么?
提前致谢
【问题讨论】:
【参考方案1】:当您通过资源编辑器查看版本信息时,您可能会注意到有一个包含 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))
【讨论】:
【参考方案2】:它必须是一个字符串,您可以在此处找到其格式: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
【讨论】:
以上是关于您应该为 Windows API 调用 VerQueryValue 提供哪些参数的主要内容,如果未能解决你的问题,请参考以下文章
您是不是应该维护基于 Web 的界面和 API 的单独版本号?