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.

Источник: http://blogs.msdn.com/b/cjacks/archive/2009/05/06/why-custom-actions-get-a-windows-vista-version-lie-on-windows-7.aspx

Другие вопросы по тегам