为什么Windows 10中的kernel32.dll上的GetFileVersionInfo返回版本6.2?

时间:2016-06-28 06:22:16

标签: c++ winapi windows-10 kernel32

我正在尝试检索kernel32.dll版本以执行Windows版本检查。但是,出于某种原因,即使kernel32.dll的版本(如文件属性中所示)为10.0.10586.0,返回的版本为:6.2.10586.0 怎么来的?

    DWORD dwDummy;
    DWORD dwFVISize = GetFileVersionInfoSize(lpszFilePath, &dwDummy);
    LPBYTE lpVersionInfo = new BYTE[dwFVISize];
    if (GetFileVersionInfo(lpszFilePath, 0, dwFVISize, lpVersionInfo) == 0)
    {
        return FALSE;
    }

    UINT uLen;
    VS_FIXEDFILEINFO *lpFfi;
    BOOL bVer = VerQueryValue(lpVersionInfo, L"\\", (LPVOID *)&lpFfi, &uLen);

    if (!bVer || uLen == 0)
    {
        return FALSE;
    }
    DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
    DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
    delete[] lpVersionInfo;

    DWORD dwLeftMost = HIWORD(dwFileVersionMS);
    DWORD dwSecondLeft = LOWORD(dwFileVersionMS);
    DWORD dwSecondRight = HIWORD(dwFileVersionLS);
    DWORD dwRightMost = LOWORD(dwFileVersionLS);

Kernel32.dll属性(与SysWow64中的相同): enter image description here

2 个答案:

答案 0 :(得分:6)

您正在从此任务的版本信息中读取错误的字段。而不是dwFileVersionMSdwFileVersionLS使用dwProductVersionMSdwProductVersionLS

文件版本字段受supportedOS兼容性问题的影响。这是它们的值取决于应用程序清单中声明的​​supportedOS级别。另一方面,产品版本字段不依赖于清单。

答案 1 :(得分:4)

  

Windows 8.1或Windows 10未显示的应用程序将返回   Windows 8操作系统版本值(6.2)。

这是来自GetVersionEx函数的MSDN描述。对于GetFileVersionInfo没有这样的说明,但真的这样做。我在调试器下看: enter image description here

enter image description here

所以dwFileVersionMS中的10.0(0xA000)可以固定为6.2或6.3 但是dwProductVersionMS - 没有改变(0xA000~10.0) 认为需要修复GetFileVersionInfo [Ex]的MSDN文档:)