您应该为 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 提供哪些参数的主要内容,如果未能解决你的问题,请参考以下文章

Windows和本机API中的系统调用?

您是不是应该维护基于 Web 的界面和 API 的单独版本号?

我们应该在微服务之间使用api网关(例如zuul)吗?

windows 执行任何操作都是通过调用API来实现的么

如果不多次调用它们,您是不是应该将代码重构为私有方法? [关闭]

VB.Net中该怎么调用windows的API?