Определение версии Windows

shisik

Well-known member
26.08.2007
154
0
#1
Почему-то в Win98 функция GetVersionEx упорно возвращает 0 и ничего не определяет :( Хотя Рихтер пишет, что эта функция в 9x работает, только вместо OSVERSIONINFOEX надо передавать OSVERSIONINFO, что я и делаю. В XP работают оба варианта, в 98 же ни один из них.
Смотрел MSDN, там про 98 вообще никаких упоминаний. Тем не менее, константа VER_PLATFORM_WIN32_WINDOWS определена, т.е. подразумевается, что в Win9x эта функция её запишет в поле dwPlatformId (как и пишет Рихтер). Где правда и как мне быть?

P.S. Я, конечно, могу просто смотреть на возвращаемое значение и если 0 - то это 9х, а если 1 - то NT. Но это не совсем правильно...
 
G

garrymax

#2
Вопервых, в API от микрософт по этой функции сказано, что начиная с Windows2000 структуру OSVERSIONINFO можно заменить структурой SVERSIONINFOEX - получается наоборот. Рекомендую поиграться.

Во вторых, функция возвращает BOOL, а значит лучше пользоваться не 0 и 1.

В третьих, если в проверяемой версии Windows98 вместо функции стоит заглушка, то можно воспользоваться вариантом старой функции DWORD GetVersion(VOID); - DWORD делим пополам и младшем слове берем версию windows (в старшем версия MS-DOS).

P.S. Не выдержал и "залез" к Рихтеру в "Windows для профессионалов" (как раз для функций Win95/98) - у него описана только структура OSVERSIONINFO, а SVERSIONINFOEX не упоминается - по логике похоже - Windows2000 был выпущен позже. Кстати, там тоже упоминается функция GetVersion. Может SVERSIONINFOEX у него в другом издании?
 

shisik

Well-known member
26.08.2007
154
0
#3
Вопервых, в API от микрософт по этой функции сказано, что начиная с Windows2000 структуру OSVERSIONINFO можно заменить структурой SVERSIONINFOEX - получается наоборот. Рекомендую поиграться.
Вот я тоже смотрю, что что-то не так получается. Хотя в XP работают обе структуры, а в 98 ни одна из них :(
Во вторых, функция возвращает BOOL, а значит лучше пользоваться не 0 и 1.
Ну 0 и 1 я сказал как раз подразумевая false и true. Я как раз обычно если надо что-то сравнить с 0, пишу
Код:
if (GetVersionEx(...))
или
Код:
if (!GetVersionEx(...))
В третьих, если в проверяемой версии Windows98 вместо функции стоит заглушка, то можно воспользоваться вариантом старой функции DWORD GetVersion(VOID); - DWORD делим пополам и младшем слове берем версию windows (в старшем версия MS-DOS).
Про это читал. Только вот непонятно, какие версии чему соответствуют (хотя можно заглянуть в MSDN). Кроме того, зачем-то жесть GetVersionEx и хочется разобраться именно с ней.
P.S. Не выдержал и "залез" к Рихтеру в "Windows для профессионалов" (как раз для функций Win95/98) - у него описана только структура OSVERSIONINFO, а SVERSIONINFOEX не упоминается - по логике похоже - Windows2000 был выпущен позже. Кстати, там тоже упоминается функция GetVersion. Может SVERSIONINFOEX у него в другом издании?
У меня 4 издание, там как раз про OSVERSIONINFOEX написано подробно, а про OSVERSIONINFO написано лишь, что её следует используется в версиях до 2000 и от OSVERSIONINFOEX она отличается отсутствием последних 5 элементов.
 
G

garrymax

#4
Извеняюсь, но F1 не пробовали:
Код:
Platform				 High order bit	Low order byte (major version number)
Windows NT					zero			 3 or 4
Windows 95						1 				4
Win32s with Windows 3.1		  1				3
еще должно быть вот такое, скорее всего в windows.h или winbase.h (у меня не стоит Visaual C++):
Код:
VER_PLATFORM_WIN32s				 - Win32s для Windows 3.1
VER_PLATFORM_WIN32_WINDOWS	 - Windows 95/98
VER_PLATFORM_WIN32_NT			 - Windows NT
Должно упростить жизнь
 

shisik

Well-known member
26.08.2007
154
0
#5
еще должно быть вот такое, скорее всего в windows.h или winbase.h (у меня не стоит Visaual C++):
Код:
VER_PLATFORM_WIN32s				 - Win32s для Windows 3.1
VER_PLATFORM_WIN32_WINDOWS	 - Windows 95/98
VER_PLATFORM_WIN32_NT			 - Windows NT
Должно упростить жизнь
Эти константы у меня тоже определены. И программа нормально компилируется. В ХР всё даже работает. Но вот в 98 не хочет :)