используя следующий код, я пытаюсь получить версию 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);
Вы читаете неправильные поля из информации о версии для этой задачи. Вместо dwFileVersionMS
а также dwFileVersionLS
использование dwProductVersionMS
а также dwProductVersionLS
,
Поля версии файла могут быть supportedOS
проблемы совместимости. То есть их значения зависят от supportedOS
уровни, заявленные в манифесте приложения. С другой стороны, поля версии продукта не зависят от манифеста.
Приложения, не указанные в Windows 8.1 или Windows 10, вернутся
значение версии ОС Windows 8 (6.2).
это из описания функции MSDN функции GetVersionEx. для GetFileVersionInfo такой заметки нет, но на самом деле это происходит так же. я смотрю под отладчиком:
поэтому 10.0 (0xA000) в dwFileVersionMS можно установить на 6.2 или 6.3.
но dwProductVersionMS — не изменилось (0xA000 ~ 10.0)
думаю нужно исправить документацию MSDN для GetFileVersionInfo [Ex] 🙂