Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение версии Windows
Форум программистов > Системное программирование > C, С++ и С Builder > MS Visual C++
shisik
Почему-то в Win98 функция GetVersionEx упорно возвращает 0 и ничего не определяет sad.gif Хотя Рихтер пишет, что эта функция в 9x работает, только вместо OSVERSIONINFOEX надо передавать OSVERSIONINFO, что я и делаю. В XP работают оба варианта, в 98 же ни один из них.
Смотрел MSDN, там про 98 вообще никаких упоминаний. Тем не менее, константа VER_PLATFORM_WIN32_WINDOWS определена, т.е. подразумевается, что в Win9x эта функция её запишет в поле dwPlatformId (как и пишет Рихтер). Где правда и как мне быть?

P.S. Я, конечно, могу просто смотреть на возвращаемое значение и если 0 - то это 9х, а если 1 - то NT. Но это не совсем правильно...
garrymax
Вопервых, в 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
Цитата(garrymax @ 19:05:2008, 13:05 ) *
Вопервых, в API от микрософт по этой функции сказано, что начиная с Windows2000 структуру OSVERSIONINFO можно заменить структурой SVERSIONINFOEX - получается наоборот. Рекомендую поиграться.

Вот я тоже смотрю, что что-то не так получается. Хотя в XP работают обе структуры, а в 98 ни одна из них sad.gif
Цитата(garrymax @ 19:05:2008, 13:05 ) *
Во вторых, функция возвращает BOOL, а значит лучше пользоваться не 0 и 1.

Ну 0 и 1 я сказал как раз подразумевая false и true. Я как раз обычно если надо что-то сравнить с 0, пишу
if (GetVersionEx(...))

или
if (!GetVersionEx(...))

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

Про это читал. Только вот непонятно, какие версии чему соответствуют (хотя можно заглянуть в MSDN). Кроме того, зачем-то жесть GetVersionEx и хочется разобраться именно с ней.
Цитата(garrymax @ 19:05:2008, 13:05 ) *
P.S. Не выдержал и "залез" к Рихтеру в "Windows для профессионалов" (как раз для функций Win95/98) - у него описана только структура OSVERSIONINFO, а SVERSIONINFOEX не упоминается - по логике похоже - Windows2000 был выпущен позже. Кстати, там тоже упоминается функция GetVersion. Может SVERSIONINFOEX у него в другом издании?

У меня 4 издание, там как раз про OSVERSIONINFOEX написано подробно, а про OSVERSIONINFO написано лишь, что её следует используется в версиях до 2000 и от OSVERSIONINFOEX она отличается отсутствием последних 5 элементов.
garrymax
Извеняюсь, но 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
Цитата(garrymax @ 20:05:2008, 14:59 ) *
еще должно быть вот такое, скорее всего в 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 не хочет sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.