среда, 7 января 2009 г.

Некорректные проверки номеров версий

Это перевод Bad version number checks. Автор: Реймонд Чен.

Номера версий. Они очень важны. И так много людей проверяет их неправильно.

Вот почему функция GetVersion в Windows 95 возвращала 3.95 вместо 4.0. Куча кода проверяла номер версии вот так:
  Ver := GetVersion;
MajorVersion := Ver and $FF;
MinorVersion := (Ver shr 8) and $FF;
if (MajorVersion < 3) or (MinorVersion < 10) then
raise Exception.Create('Эта программа требует Windows 3.1');
А теперь посмотрим, что произойдёт, если номер версии будет 4.0. Проверка старшего (major) номера версии пройдёт успешно, но проверка младшего (minor) номера будет неудачной, т.к. 0 меньше 10.

Эта ошибка была так распространена, что нам надоело исправлять каждое приложение и мы просто решили: "Ну и отлично. Если кто-нибудь спросит, мы - Windows версии 3.95".

Я подозреваю, что по этой же причине DirectX всегда говорит, что он версии 4.x.

Примечание переводчика: для избежания таких проблем в своих программах Delphi содержит функцию CheckWin32Version. Но и она не обошлась без проблем в реализации. В некоторых версиях Delphi (до 7-ки) она реализована с точностью до наоборот.

2 комментария:

  1. Установил себе Windows 7. В общем большинство дров и софта установилось без проблем (Windows не нашла своего драйвера для тюнера и инфракрасного порта), за исключением двух мелких тулсов, которые радостно отрапортовали: "This application requires Windows Vista or later".

    ОтветитьУдалить
  2. Проверку на "or later" видимо забыли дописать)))

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.