如何使用VerQueryValue?

时间:2012-06-28 04:06:12

标签: winapi

我有一个需要从特定dll检索版本信息的exe(例如:FileDescription)。我的代码已经调用了GetFileVersionInfoSize和GetFileVersionInfo。但即使经过http://msdn.microsoft.com/en-us/library/ms647464(v=vs.85)和其他示例,我也不确定如何应用VerQueryValue。

有人可以解释/阐明如何应用VerQueryValue及其用法吗?感谢。

2 个答案:

答案 0 :(得分:6)

要通过VerQueryValue获取FileDescription,只需复制并粘贴VerQueryValue文档中的示例代码,并根据需要进行修改。

该示例代码背后的基本思想是:

  • 使用第二种形式(\ VarFileInfo \ Translation)获取翻译列表。
  • 然后使用第三种形式(\ StringFileInfo \ lang-codepage \ string-name)获取字符串。

(第一个form()仅适用于VS_FIXEDFILEINFO,版本号部分,标志等的一组数值。)

示例代码获取每种语言的FileDescription。如果你知道你只有一种语言(例如,因为你正在查看自己的应用程序,并且没有翻译),你可以跳过循环并返回第一个。对于更一般的用途,您希望为用户的语言选择最佳匹配并返回该语言。

答案 1 :(得分:0)

这是一个工作示例,经过多次尝试和错误。我使用的是 Borland C++,因此对于不兼容的环境,可能需要更改一些小细节。

#include <Windows.h>

std::string GetAppVersion()
{
    DWORD dwHandle;
    TCHAR fileName[MAX_PATH];

    GetModuleFileName(NULL, fileName, MAX_PATH);
    DWORD dwSize = GetFileVersionInfoSize(fileName, &dwHandle );
    TCHAR buffer[dwSize];

    VS_FIXEDFILEINFO* pvFileInfo = NULL;
    UINT fiLen = 0;

    if ((dwSize > 0) && GetFileVersionInfo(fileName, dwHandle, dwSize, &buffer))
    {
        VerQueryValue(&buffer, L"\\", (LPVOID*)&pvFileInfo, &fiLen);
    }

    if (fiLen > 0)
    {
        char buf[25];
        int len = sprintf(buf, "%hu.%hu.%hu.%hu",
            HIWORD(pvFileInfo->dwFileVersionMS),
            LOWORD(pvFileInfo->dwFileVersionMS),
            HIWORD(pvFileInfo->dwFileVersionLS),
            LOWORD(pvFileInfo->dwFileVersionLS)
        );

        return std::string(buf, len);
    }
    else
    {
        return std::string("(Unknown)");
    }
}