Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  100

•  TDictionary Custom Sort  3 298

•  Fast Watermark Sources  3 046

•  3D Designer  4 802

•  Sik Screen Capture  3 297

•  Patch Maker  3 516

•  Айболит (remote control)  3 614

•  ListBox Drag & Drop  2 972

•  Доска для игры Реверси  81 428

•  Графические эффекты  3 901

•  Рисование по маске  3 213

•  Перетаскивание изображений  2 596

•  Canvas Drawing  2 716

•  Рисование Луны  2 543

•  Поворот изображения  2 149

•  Рисование стержней  2 153

•  Paint on Shape  1 558

•  Генератор кроссвордов  2 215

•  Головоломка Paletto  1 757

•  Теорема Монжа об окружностях  2 196

•  Пазл Numbrix  1 676

•  Заборы и коммивояжеры  2 047

•  Игра HIP  1 271

•  Игра Go (Го)  1 219

•  Симулятор лифта  1 463

•  Программа укладки плитки  1 206

•  Генератор лабиринта  1 535

•  Проверка числового ввода  1 341

•  HEX View  1 481

•  Физический маятник  1 348

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

RTL.CheckWin32Version. Функция некорректна



Автор: Дмитрий Померанцев

Только Delphi6 (SP2, возможно и более младшие версии Delphi6). Delphi5 и младше не исследовались, но в них отсутствовали проблемы, связанные с этой функцией. В Delphi7 ошибка исправлена.

Функция


CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean;

предназначена для того, чтобы удостовериться, что версия Windows не меньше указанной. Эта функция используется самой VCL для того, чтобы убедиться в правомерности вызовов API в разных версиях Windows. Во встреченных мной случаях проверялось несоответствие WindowsXP вызовом not CheckWin32Version(5, 1) — некоторых API (например, Flat ScrollBars устарели и не рекомендуются к использованию в Windows XP и выше). Поскольку функция небольшая, то для понимания ошибки лучше привести ее целиком (модуль Sysutils.pas из Delphi6 SP2):


function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean;
begin
  Result := (AMajor > Win32MajorVersion) or
    ((AMajor = Win32MajorVersion) and
    (AMinor >= Win32MinorVersion));
end;

Несложно понять, что функция будет возвращать True с параметрами 5, 1 как на Windows 2000 (версия 5.0), так и на Windows NT (версия 4.0) и других версиях Windows, предшествующих Windows XP.

В Delphi7 эта функция была исправлена:


function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean;
begin
  Result := (Win32MajorVersion > AMajor) or
    ((Win32MajorVersion = AMajor) and
    (Win32MinorVersion >= AMinor));
end;

Проблемы, связанные с этой функцией, двояки — во первых, в Delphi6 все функции, опирающиеся на проверку версии Windows через вызов CheckWin32Version, не будут работать — в Windows XP они могут не поддерживаться, а в более младших версиях они так и не будут использованы. Приложения, созданные в Delphi6, использующие эту функцию (при условии, что програмист "адаптировался" к реализации от Borland), могут неожиданно перестать работать правильно после перекомпиляции в Delphi7.

ТИПОВЫЕ РЕШЕНИЯ

Учитывая, что ServicePack2 для Delphi6 на данный момент последнее, а скорее всего — совсем последнее обновление для Delphi6, можно рекомендовать (варианты):

Обновить Delphi6 до Delphi7 Studio.

Заменить функцию CheckWin32Version в модуле SysUtils на версию из Delphi7 (выше). Перекомпилировать VCL.








Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте