Знаете ли вы, что...
От: qwertyuiop Российская Империя  
Дата: 13.05.15 10:20
Оценка: 3 (1) :))) :)))
Функцию GetVersionEx собираются отменить и теперь получить версию системы можно будет таким изящным кодом:
    if (IsWindowsXPOrGreater())
    {
        printf("XPOrGreater\n");
    }

    if (IsWindowsXPSP1OrGreater())
    {
        printf("XPSP1OrGreater\n");
    }

    if (IsWindowsXPSP2OrGreater())
    {
        printf("XPSP2OrGreater\n");
    }

    if (IsWindowsXPSP3OrGreater())
    {
        printf("XPSP3OrGreater\n");
    }

    if (IsWindowsVistaOrGreater())
    {
        printf("VistaOrGreater\n");
    }

    if (IsWindowsVistaSP1OrGreater())
    {
        printf("VistaSP1OrGreater\n");
    }

    if (IsWindowsVistaSP2OrGreater())
    {
        printf("VistaSP2OrGreater\n");
    }

    if (IsWindows7OrGreater())
    {
        printf("Windows7OrGreater\n");
    }

    if (IsWindows7SP1OrGreater())
    {
        printf("Windows7SP1OrGreater\n");
    }

    if (IsWindows8OrGreater())
    {
        printf("Windows8OrGreater\n");
    }

    if (IsWindows8Point1OrGreater())
    {
        printf("Windows8Point1OrGreater\n");
    }

    if (IsWindows10OrGreater())
    {
        printf("Windows10OrGreater\n");
    }

    if (IsWindowsServer())
    {
        printf("Server\n");
    }
    else
    {
        printf("Client\n");
    }


Я отвечаю за свои слова, а не за то как вы их интерпретируете!
Re: Знаете ли вы, что...
От: lxa http://aliakseis.livejournal.com
Дата: 13.05.15 11:21
Оценка: 2 (2) :))
Microsoft такой Microsoft ...

Насколько я помню, функция GetVersion есть в API всех версий Windows:

DWORD GetVersion();

С этой простой функцией связана целая история. Сначала ее разработали для 16-разрядной Windows, и она должна была в старшем слове возвращать номер версии MS-DOS, а в младшем — номер версии Windows. Соответственно в каждом слове старший байт сообщал основной номер версии, младший — дополнительный номер версии.
Увы, программист, писавший ее код, слегка ошибся, и получилось так, что номера версии Windows поменялись местами: в старший байт попадал дополнительный номер, а в младший — основной. Поскольку многие программисты уже начали пользоваться этой функцией, Майкрософт пришлось оставить все, как есть, и изменить документацию с учетом ошибки.
Из-за всей этой неразберихи вокруг GetVersion в Windows API включили новую функцию — GetVersionEx:

BOOL GetVersionEx(POSVERSIONINFOEX pVersionInformation);

Re: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 16:50
Оценка: 9 (5) +6 :))) :)))
Здравствуйте, 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.
Отредактировано 13.05.2015 17:08 tlp . Предыдущая версия .
Re[2]: Знаете ли вы, что...
От: Философ Ад http://vk.com/id10256428
Дата: 13.05.15 17:20
Оценка: +2
Здравствуйте, tlp, Вы писали:

tlp>
tlp>else
tlp>{
tlp>   // this OS is not suported
tlp>}
tlp>


ПРЕКРАСНО!
Так и надо.

tlp>кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.


Зря они это сделали: лучше оно просто работать не будет, чем будет считать мне погоду в Африке или испортит данные.
Если они так тупо косячат здесь, то дальше и глубже будет только хуже — существуют куда более сложные API и более сложные проверки условий.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 17:36
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Зря они это сделали: лучше оно просто работать не будет, чем будет считать мне погоду в Африке или испортит данные.

Если посмотреть на ситуацию в целом, МС сделала абсолютно правильный шег: она убрала себе головную боль и уменьша support & migration costs

Ф>Если они так тупо косячат здесь, то дальше и глубже будет только хуже — существуют куда более сложные API и более сложные проверки условий.

До более сложных API Раджикумаров не допускают, а это — относительно простой API, который часто используется неправильно, увеличивая стоимость поддержки кода при выходе новой версии windows (кто-то должен отвечать на вопросы, писать патчи/воркэраунды для инсталляторов).
Re[2]: Знаете ли вы, что...
От: zubactik  
Дата: 13.05.15 17:36
Оценка: +1 :))) :))
Поясните, пожалуйста, (для еще более некомпетентных) в этом фрагменте
if (vi.dwMajorVersion > 5 && os vi.dwMinorVersion >= 1)
{
    // it is XP or later 
}
else
{
    // this OS is not suported
}


ошибка именно в куске
else
{
    // this OS is not suported
}

?

Или что-то не так и с
if (vi.dwMajorVersion > 5 && os vi.dwMinorVersion >= 1)
{
    // it is XP or later 
}

?
Re[3]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 17:38
Оценка:
Здравствуйте, zubactik, Вы писали:

Z>Поясните, пожалуйста, (для еще более некомпетентных) в этом фрагменте


второе

PS osvi — опечатка, но правиль исходное сообщение не буду, т.к. на него уже ответили.
Re[3]: Знаете ли вы, что...
От: Философ Ад http://vk.com/id10256428
Дата: 13.05.15 17:56
Оценка: +1
Здравствуйте, 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, или просто представь, что он выдаст — объяснение не потребуется. Это главная ошибка в этом коде.
Можешь попробовать на любой другой, где нулевая минорная версия.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[4]: Знаете ли вы, что...
От: zubactik  
Дата: 13.05.15 18:08
Оценка:
Да нет, дальше понятно. Просто неясно сколько именно здесь было ошибок.
Re[5]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 18:11
Оценка:
Здравствуйте, zubactik, Вы писали:

Z>Да нет, дальше понятно. Просто неясно сколько именно здесь было ошибок.

вы не спрашивали, сколько здесь ошибок, вы спришвали, где ошибка — т.е. подразумевали, что она одна).
На самом деле ошибок в этом коде больше, но остальные не такие существенные.
Re[2]: Знаете ли вы, что...
От: AlexRK  
Дата: 13.05.15 18:18
Оценка:
Здравствуйте, tlp, Вы писали:

tlp>Новые функции придумали не просто так.

tlp>Причина их появления в том, что типичные Раджикумары, пищущие код проверки версии виндовса, не в состоянии написать правилньый код, проверящюий что версия виндовс — какая-то версия, после версии X.Y
tlp>Т.е. наши друзья пишут обычно:
tlp>кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.

Какая трогательная забота о Раджикумарах.
А что, функции для получения версии самая сложная часть API? Ошибок в других местах Раджикумары не делают или там уже все настолько просто, насколько это возможно (но не проще)?
Re[6]: Знаете ли вы, что...
От: zubactik  
Дата: 13.05.15 18:18
Оценка:
Да, я сначала подумал на второй сегмент, а ваш ответ дал толчок подумать над тем что не так в первом.
Re[3]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 18:24
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Какая трогательная забота о Раджикумарах.

Это снижение расходов на миграцию между версиями windows, в чем МС очень заинтересован. Забота о Раджикумарах получается в виде бесплатного дополнения.

ARK>А что, функции для получения версии самая сложная часть API? Ошибок в других местах Раджикумары не делают или там уже все настолько просто, насколько это возможно (но не проще)?

Эта функия — простая часть API и Раджикумары ее часто используют неправильно, получая проблемы на пустом месте при выходе новой версии ОС.
Ошибки в других местах они, несомненно, делают, но не везде можно легко улучшить юзабилити API, сэкономив таким образом время и деньги в долгосрочной перспективе.
Re[7]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 18:25
Оценка:
Здравствуйте, zubactik, Вы писали:

Z>Да, я сначала подумал на второй сегмент, а ваш ответ дал толчок подумать над тем что не так в первом.

там есть и другие ошибки Раджикумары — мастера этого дела.
Re[2]: Знаете ли вы, что...
От: The Passenger Голландия  
Дата: 13.05.15 20:48
Оценка: :))) :)
Здравствуйте, tlp, Вы писали:


tlp>Т.е. наши друзья пишут обычно:


конгениально — совместимость с индусами — новый мэйнстрим программирования
хотя и не первый пример
Весь мир — Кремль, а люди в нем — агенты
Re[2]: Знаете ли вы, что...
От: . Великобритания  
Дата: 13.05.15 21:22
Оценка:
Здравствуйте, tlp, Вы писали:

tlp> if (vi.dwMajorVersion > 5 && osvi.dwMinorVersion >= 1)


tlp> кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.

Ерунда какая-то. А почему нельзя просто
if(IsWindowsVersionIsOrGreater(5, 1))
{
}

?
И вообще... версирование по major/minor нужно если хочешь проверять только некоторые минорные версии мажорных. Т.е.
if (vi.dwMajorVersion == 5 && vi.dwMinorVersion >= 2
  || vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 3
  || vi.dwMajorVersion vi.dwMajorVersion >= 6)

Иначе говоря, хотим какую-то новую функциональность, которую сделали в версии начиная с седьмой, и её же забэкпортили в пятую с сервис-пака 2 и в шестую с сервис пака 3.

Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п.
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 21:27
Оценка:
Здравствуйте, The Passenger, Вы писали:


TP>конгениально — совместимость с индусами — новый мэйнстрим программирования

FTFY
Re[3]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 21:29
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, tlp, Вы писали:


tlp>> if (vi.dwMajorVersion > 5 && osvi.dwMinorVersion >= 1)


tlp>> кода с такими ошибками очень много, и чтобы поправить что-то в консерватории, МС добавила более простой API.

.>Ерунда какая-то. А почему нельзя просто
.>
.>if(IsWindowsVersionIsOrGreater(5, 1))
.>{
.>}
.>

.>?

можно (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 и т.п.


Теоретики в треде! %)
Отредактировано 13.05.2015 22:08 tlp . Предыдущая версия .
Re[4]: Знаете ли вы, что...
От: . Великобритания  
Дата: 13.05.15 21:36
Оценка:
Здравствуйте, tlp, Вы писали:

tlp> можно, но лучше явное имя ОС, т.к. большинство проверок выглядят именно как "наша програама требует windows 7 и выше".

Так чем тогда простой enum и одна функция не устраивает?

tlp> .>Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п.

tlp> Теоретики в треде! %)
Так страшно на такое извращение смотреть. Как теперь такое развидеть?
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Знаете ли вы, что...
От: tlp  
Дата: 13.05.15 22:04
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, tlp, Вы писали:


tlp>> можно, но лучше явное имя ОС, т.к. большинство проверок выглядят именно как "наша програама требует windows 7 и выше".

.>Так чем тогда простой enum и одна функция не устраивает?
Например тем, что 20 лет назад, когда придумывали существующую нумерацию версий, об этом не подумали.

tlp>> .>Иначе вообще проще использовать одно число, "5.1" == 501 и пачку #define WINDOWS_XP_SP2 501 и т.п.

tlp>> Теоретики в треде! %)
.>Так страшно на такое извращение смотреть. Как теперь такое развидеть?
Перестать программировать и пойти пасти коз например
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.