Windows 8 минорная версия, возвращающая 0 вместо 2
У меня есть код на C++, цель которого - найти версию для Windows:
OSVERSIONINFOEX osvi;
BOOL bOsVersionInfoEx;
int iRet = OS_UNKNOWN;
ZeroMemory ( & osvi, sizeof ( OSVERSIONINFOEX ) );
osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFOEX );
if ( !( bOsVersionInfoEx = GetVersionEx ( ( OSVERSIONINFO * ) & osvi ) ) )
{
osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO );
if ( ! GetVersionEx ( ( OSVERSIONINFO * ) & osvi ) )
return OS_UNKNOWN;
}
//the rest is irrelevant ...
iRet вернет внутреннее значение перечисления, идентифицирующее версию Windows. Он будет скорректирован в соответствии со значениями, возвращенными в osvi.dwPlatformId, osvi.dwMajorVersion и osvi.dwMinorVersion.
Согласно MSDN, для Windows 8 значение MajorVersion равно 6, а значение MinorVersion равно 2.
У меня есть этот код, скомпилированный в DLL, и код на самом деле работает, если я вызываю DLL из тестовой программы EXE.
Но если я вызываю один и тот же код из одной и той же библиотеки DLL из пользовательского действия в пакете установки Windows (MSI), GetVersionEx() возвращает 0 для поля MinorVersion.
Кто-нибудь еще испытывал эту ошибку? Кто-нибудь знает, как обойти это?
1 ответ
Оказывается, установщик Windows врет о версии по умолчанию при использовании GetVersion(Ex) в Windows 7+. Ответ всегда Vista SP0. Вместо этого вы можете использовать значение MSI для VersionNT.