为什么 GetFileVersionInfo on kernel32.dll in Windows 10 return 版本 6.2?
Why does GetFileVersionInfo on kernel32.dll in Windows 10 return version 6.2?
我正在尝试检索 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 中相同):
您正在从该任务的版本信息中读取错误的字段。而不是 dwFileVersionMS
和 dwFileVersionLS
使用 dwProductVersionMS
和 dwProductVersionLS
.
文件版本字段存在 supportedOS
兼容性问题。也就是说,它们的值取决于应用程序清单中声明的 supportedOS
级别。另一方面,产品版本字段不依赖于清单。
Applications not manifested for Windows 8.1 or Windows 10 will return
the Windows 8 OS version value (6.2).
这是来自 GetVersionEx 函数的 MSDN 描述。对于 GetFileVersionInfo 没有这样的说明,但实际上这样做是一样的。我在调试器下查看:
所以 dwFileVersionMS 中的 10.0 ( 0xA000) 可以固定为 6.2 或 6.3
但 dwProductVersionMS - 未更改 (0xA000 ~ 10.0)
认为需要修复 GetFileVersionInfo[Ex] 的 MSDN 文档 :)
我正在尝试检索 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 中相同):
您正在从该任务的版本信息中读取错误的字段。而不是 dwFileVersionMS
和 dwFileVersionLS
使用 dwProductVersionMS
和 dwProductVersionLS
.
文件版本字段存在 supportedOS
兼容性问题。也就是说,它们的值取决于应用程序清单中声明的 supportedOS
级别。另一方面,产品版本字段不依赖于清单。
Applications not manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version value (6.2).
这是来自 GetVersionEx 函数的 MSDN 描述。对于 GetFileVersionInfo 没有这样的说明,但实际上这样做是一样的。我在调试器下查看:
所以 dwFileVersionMS 中的 10.0 ( 0xA000) 可以固定为 6.2 或 6.3 但 dwProductVersionMS - 未更改 (0xA000 ~ 10.0) 认为需要修复 GetFileVersionInfo[Ex] 的 MSDN 文档 :)