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

Тема в разделе "MS Visual C++", создана пользователем shisik, 19 май 2008.

  1. shisik

    shisik Well-Known Member

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

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

    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 у него в другом издании?
     
  3. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    Вот я тоже смотрю, что что-то не так получается. Хотя в XP работают обе структуры, а в 98 ни одна из них :(
    Ну 0 и 1 я сказал как раз подразумевая false и true. Я как раз обычно если надо что-то сравнить с 0, пишу
    Код (Text):
    if (GetVersionEx(...))
    или
    Код (Text):
    if (!GetVersionEx(...))
    Про это читал. Только вот непонятно, какие версии чему соответствуют (хотя можно заглянуть в MSDN). Кроме того, зачем-то жесть GetVersionEx и хочется разобраться именно с ней.
    У меня 4 издание, там как раз про OSVERSIONINFOEX написано подробно, а про OSVERSIONINFO написано лишь, что её следует используется в версиях до 2000 и от OSVERSIONINFOEX она отличается отсутствием последних 5 элементов.
     
  4. garrymax

    garrymax Гость

    Извеняюсь, но F1 не пробовали:
    Код (Text):
    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++):
    Код (Text):
    VER_PLATFORM_WIN32s              - Win32s для Windows 3.1
    VER_PLATFORM_WIN32_WINDOWS   - Windows 95/98
    VER_PLATFORM_WIN32_NT            - Windows NT
    Должно упростить жизнь
     
  5. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    Эти константы у меня тоже определены. И программа нормально компилируется. В ХР всё даже работает. Но вот в 98 не хочет :)
     
Загрузка...

Поделиться этой страницей