【发布时间】:2016-10-30 07:47:21
【问题描述】:
我正在尝试检索 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);
【问题讨论】:
-
将您的应用程序构建为 64 位可执行文件,看看是否得到相同的结果。
-
请参阅how to detect windows 10 in c++ 了解替代方法。
-
@RbMm:
RtlGetNtVersionNumbers未记录在案。它不是公共编程接口的一部分,并且可能在操作系统的未来版本中不可用。为什么不推荐RtlGetVersion呢?至少这是记录在案的(即使未来的操作系统可能也不支持从用户模式调用内核模式例程)。 -
@RbMm:编程与统计无关。仅仅因为 API 在
内没有改变并不意味着它不会在 消失。更好的性能永远不是忽略已记录 API 的正当理由。如果您不关心正确性,那么提高性能非常容易(通过完全省略调用)。 -
如果
VerQueryValue失败,此代码将泄漏内存,因为在释放lpVersionInfo之前提前返回。没什么大不了的,只是想指出这一点。
标签: c++ winapi windows-10 kernel32