Насколько я помню, функция GetVersion есть в API всех версий Windows:
DWORD GetVersion();
С этой простой функцией связана целая история. Сначала ее разработали для 16-разрядной Windows, и она должна была в старшем слове возвращать номер версии MS-DOS, а в младшем — номер версии Windows. Соответственно в каждом слове старший байт сообщал основной номер версии, младший — дополнительный номер версии.
Увы, программист, писавший ее код, слегка ошибся, и получилось так, что номера версии Windows поменялись местами: в старший байт попадал дополнительный номер, а в младший — основной. Поскольку многие программисты уже начали пользоваться этой функцией, Майкрософт пришлось оставить все, как есть, и изменить документацию с учетом ошибки.
Из-за всей этой неразберихи вокруг GetVersion в Windows API включили новую функцию — GetVersionEx:
Здравствуйте, qwertyuiop, Вы писали:
Q>Функцию GetVersionEx собираются отменить и теперь получить версию системы можно будет таким изящным кодом:
Типичный пример эффекта Даннинга-Крюгера: некомпетентные люди делают некомпетентные выводы о том, в чем не разбираются и думают, что тонко пошутили. Понять факт того, что они сказали глупость, им мешает отсутствие нужных знаний.
Будем бороться.
Указаные вами функции существуют с момента появления windows 2000 и доступны всем желающим.
Что интересно, скомпилированная программа, использующая функциию "IsWindows8OrGreater" (а также все функции, которые будут добавлены позднее) будет работать на windows 2000 (и на ней эта функция вернет false).
домашнее задание — разобраться, как именно это получается (и нет, это не делается каким-то патчем в старые windows 2000)
GetVersionEx (как и любой другой API) никто не будет отменять или запрещать, т.к. это поломает существующие программы.
Новые функции придумали не просто так.
Причина их появления в том, что типичные Раджикумары, пищущие код проверки версии виндовса, не в состоянии написать правилньый код, проверящюий что версия виндовс — какая-то версия, после версии X.Y
Т.е. наши друзья пишут обычно:
OSVERSIONINFO vi;
GetVersionEx(&vi);
if (vi.dwMajorVersion > 5 && osvi.dwMinorVersion >= 1)
{
// it is XP or later
}
else
{
// this OS is not suported
}
кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.
tlp>else
tlp>{
tlp> // this OS is not suported
tlp>}
tlp>
ПРЕКРАСНО!
Так и надо.
tlp>кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.
Зря они это сделали: лучше оно просто работать не будет, чем будет считать мне погоду в Африке или испортит данные.
Если они так тупо косячат здесь, то дальше и глубже будет только хуже — существуют куда более сложные API и более сложные проверки условий.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
Ф>Зря они это сделали: лучше оно просто работать не будет, чем будет считать мне погоду в Африке или испортит данные.
Если посмотреть на ситуацию в целом, МС сделала абсолютно правильный шег: она убрала себе головную боль и уменьша support & migration costs
Ф>Если они так тупо косячат здесь, то дальше и глубже будет только хуже — существуют куда более сложные API и более сложные проверки условий.
До более сложных API Раджикумаров не допускают, а это — относительно простой API, который часто используется неправильно, увеличивая стоимость поддержки кода при выходе новой версии windows (кто-то должен отвечать на вопросы, писать патчи/воркэраунды для инсталляторов).
Здравствуйте, zubactik, Вы писали:
Z>Поясните, пожалуйста, (для еще более некомпетентных) в этом фрагменте
Z>Или что-то не так и с Z>
Z>if (vi.dwMajorVersion > 5 && os vi.dwMinorVersion >= 1)
Z>{
Z> // it is XP or later
Z>}
Z>
Z>?
А ты запусти этот код на Windows Vista, или просто представь, что он выдаст — объяснение не потребуется. Это главная ошибка в этом коде.
Можешь попробовать на любой другой, где нулевая минорная версия.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, zubactik, Вы писали:
Z>Да нет, дальше понятно. Просто неясно сколько именно здесь было ошибок.
вы не спрашивали, сколько здесь ошибок, вы спришвали, где ошибка — т.е. подразумевали, что она одна).
На самом деле ошибок в этом коде больше, но остальные не такие существенные.
Здравствуйте, tlp, Вы писали:
tlp>Новые функции придумали не просто так. tlp>Причина их появления в том, что типичные Раджикумары, пищущие код проверки версии виндовса, не в состоянии написать правилньый код, проверящюий что версия виндовс — какая-то версия, после версии X.Y tlp>Т.е. наши друзья пишут обычно: tlp>кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.
Какая трогательная забота о Раджикумарах.
А что, функции для получения версии самая сложная часть API? Ошибок в других местах Раджикумары не делают или там уже все настолько просто, насколько это возможно (но не проще)?
Здравствуйте, AlexRK, Вы писали:
ARK>Какая трогательная забота о Раджикумарах.
Это снижение расходов на миграцию между версиями windows, в чем МС очень заинтересован. Забота о Раджикумарах получается в виде бесплатного дополнения.
ARK>А что, функции для получения версии самая сложная часть API? Ошибок в других местах Раджикумары не делают или там уже все настолько просто, насколько это возможно (но не проще)?
Эта функия — простая часть API и Раджикумары ее часто используют неправильно, получая проблемы на пустом месте при выходе новой версии ОС.
Ошибки в других местах они, несомненно, делают, но не везде можно легко улучшить юзабилити API, сэкономив таким образом время и деньги в долгосрочной перспективе.
Здравствуйте, zubactik, Вы писали:
Z>Да, я сначала подумал на второй сегмент, а ваш ответ дал толчок подумать над тем что не так в первом.
там есть и другие ошибки Раджикумары — мастера этого дела.
Здравствуйте, tlp, Вы писали:
tlp> if (vi.dwMajorVersion > 5 && osvi.dwMinorVersion >= 1)
tlp> кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.
Ерунда какая-то. А почему нельзя просто
if(IsWindowsVersionIsOrGreater(5, 1))
{
}
?
И вообще... версирование по major/minor нужно если хочешь проверять только некоторые минорные версии мажорных. Т.е.
Иначе говоря, хотим какую-то новую функциональность, которую сделали в версии начиная с седьмой, и её же забэкпортили в пятую с сервис-пака 2 и в шестую с сервис пака 3.
Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п.
Здравствуйте, ., Вы писали:
.>Здравствуйте, tlp, Вы писали:
tlp>> if (vi.dwMajorVersion > 5 && osvi.dwMinorVersion >= 1)
tlp>> кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API. .>Ерунда какая-то. А почему нельзя просто .>
можно (IsWindowsVersionOrGreater https://msdn.microsoft.com/en-us/library/windows/desktop/dn424964(v=vs.85).aspx), но лучше явное имя ОС, т.к. большинство проверок выглядят именно как "наша програама требует windows 7 и выше".
.>И вообще... версирование по major/minor нужно если хочешь проверять только некоторые минорные версии мажорных. Т.е. .>Иначе говоря, хотим какую-то новую функциональность, которую сделали в версии начиная с седьмой, и её же забэкпортили в пятую с сервис-пака 2 и в шестую с сервис пака 3.
.>Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п.
Здравствуйте, tlp, Вы писали:
tlp> можно, но лучше явное имя ОС, т.к. большинство проверок выглядят именно как "наша програама требует windows 7 и выше".
Так чем тогда простой enum и одна функция не устраивает?
tlp> .>Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п. tlp> Теоретики в треде! %)
Так страшно на такое извращение смотреть. Как теперь такое развидеть?
Здравствуйте, ., Вы писали:
.>Здравствуйте, tlp, Вы писали:
tlp>> можно, но лучше явное имя ОС, т.к. большинство проверок выглядят именно как "наша програама требует windows 7 и выше". .>Так чем тогда простой enum и одна функция не устраивает?
Например тем, что 20 лет назад, когда придумывали существующую нумерацию версий, об этом не подумали.
tlp>> .>Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п. tlp>> Теоретики в треде! %) .>Так страшно на такое извращение смотреть. Как теперь такое развидеть?
Перестать программировать и пойти пасти коз например