【问题标题】:Problem getting full version number for Windows 10 with GetFileVersionInfo and VerQueryValue使用 GetFileVersionInfo 和 VerQueryValue 获取 Windows 10 的完整版本号时出现问题
【发布时间】:2019-06-25 14:30:26
【问题描述】:

我想获取 Windows 的完整版本号,就像 CMD 一样:

我最终得到了这个MS doc,上面写着:

要获取操作系统的完整版本号,请调用 系统 DLL 之一上的 GetFileVersionInfo 函数,例如 Kernel32.dll,然后调用 VerQueryValue 获取 \StringFileInfo\\ProductVersion 文件版本的子块 信息。

所以我尝试在这段代码中使用这些函数:

#include <Windows.h>
#include <wchar.h>

#pragma comment(lib, "Mincore.lib")

int wmain(int argc, wchar_t* argv[])
{
    // GetFileVersionInfoW
    LPCWSTR fileName = L"C:\\Windows\\System32\\kernel32.dll";
    DWORD fileInfoSize;

    fileInfoSize = GetFileVersionInfoSizeW(fileName, NULL);

    if (fileInfoSize == 0)
    {
        fwprintf(stderr, L"\nError code: %u\n", GetLastError());
        return;
    }

    // GetFileVersionInfoW
    VOID* pFileVerInfo = malloc(fileInfoSize);

    if (pFileVerInfo == NULL)
    {
        fwprintf(stderr, L"Failed allocating!\n");
        return;
    }

    if (!GetFileVersionInfoW(fileName, 0, fileInfoSize, pFileVerInfo))
    {
        fwprintf(stderr, L"Error code: %u\n", GetLastError());
        free(pFileVerInfo);
        return;
    }

    // VerQueryValueW
    LPCWSTR subBlock = L"\\StringFileInfo\\\\ProductVersion";
    VS_FIXEDFILEINFO * pFileInfo;
    UINT pLen = 0;

    if (!VerQueryValueW(pFileVerInfo, subBlock, (LPVOID*)& pFileInfo, &pLen))
    {
        fwprintf(stderr, L"Error code: %u\n", GetLastError());
        return;
    }


    return 0;
}

但是,VerQueryValueW 函数失败,代码为 1813,我不知道为什么。我也不知道如何在调用函数后显示完整版本。

你能帮帮我吗?

【问题讨论】:

  • 尝试为不同的失败案例输出不同的文本......你无法分辨是GetFileVersionInfoSizeW失败了,还是GetFileVersionInfoW,还是VerQueryValueW
  • 嗯...我在 Visual Studio 中设置了一些断点,结果发现是 VerQueryValueW 失败了。
  • return; 在返回 int 的函数中是非法的
  • 你应该看看this question instead 而不是跳槽。

标签: c winapi


【解决方案1】:

L"\\StringFileInfo\\\\ProductVersion" 不正确。中间必须有一个语言 ID。在我的 Windows 10 安装中,工作字符串是:L"\\StringFileInfo\\040904B0\\ProductVersion"。但也许这在其他系统上会有所不同。

根据 cmets 中 Jonathan Potter 的建议,您可以通过查询 \\VarFileInfo\\Translation 找到 ID。


实现目标的更简单的选择包括:

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2019-02-02
    • 2016-10-30
    • 2020-08-12
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多