3

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

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

4

2 回答 2

6

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

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

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

(第一种形式 () 仅用于 VS_FIXEDFILEINFO,即版本号、标志等部分的一组数值)

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

于 2012-06-28T20:33:52.730 回答
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)");
    }
}
于 2021-06-14T20:21:56.763 回答