Главная » Delphi » Совместимость Delphi и Kylix

0

Реализуя  приложение с высокой степенью совместимости между Delphi  и Kylix, не обходимо учитывать тот факт, что технология VCL применима только  для Windows. Ес ли необходимо создать  межплатформенное приложение или  компонент, то  придетсявоспользоваться библиотекой компонентов для X платформы (CLX — Component Library for X platform), которая в настоящий момент поддерживает и Delphi  6, и Kylix. Более  под робная информация о платформе CLX приведена в главах 10, “Архитектура компонен тов: VCL и CLX” , и 13, “Разработка компонентов CLX”. В библиотеку CLX входят четы ре основных компонента.

•  BaseCLX содержит основные системные компоненты.

•  DataCLX представляет собой  технологию, аналогичную dbExpress. Она  обеспе чивает простой и эффективный доступ к данным  и управление ими. Более  под робная информация о dbExpress приведена в главе  8, “Применение dbExpress при разработке баз данных”.

•  NetCLX  включает в себя  компоненты и мастера для создания сетевых прило жений с архитектурой клиент/сервер. Возможно, NetCLX  представляет собой наилучшую  и очень  надежную  среду  разработки Web приложений, в которую входит  и технология WebBroker, появившаяся в предыдущей версии. NetCLX применима и для Linux, и для Windows, как для клиентов, так и для серверов.

•  VisualCLX  обеспечивает  возможность  создания  межплатформенного  графиче ского  пользовательского интерфейса (GUI). Внешне  VisualCLX очень  похож  на VCL, но на самом  деле  построен на базе  библиотеки Qt  производства Troll Tech (http://www.trolltech.com), в отличие от VCL, построенной на базе API Win32. Qt представляет собой межплатформенную среду разработки, которая по зволяет создавать GUI для нескольких платформ, в том числе Windows и Linux.

Создав  новое  приложение CLX (меню  File, пункты  New, CLX Application), в разделе uses модуля главной формы можно  увидеть имена  нескольких подключаемых модулей, имена  которых начинаются буквой Q, например QGraphics, QControls, QForms и так далее. Эти модули похожи по содержанию и возможностям на аналогичные по именам модули VCL, но предназначены для приложений, независимых от платформы.

НА ЗАМЕТКУ

Хотя современные версии CLX поддерживают только Windows и Kylix, они разработа- ны так, чтобы в будущем их можно было легко модернизировать для поддержки других платформ. Например, Qt поддерживает около дюжины различных платформ.

Только не в Linux

Следует отметить: технологии, специфические для Windows,  нельзя  перенести на платформу Linux.  Это означает, что таким прекрасным технологиям, как ADO, COM/COM+, BDE, MAPI, и многим  другим нет места в межплатформенном приложе нии. Следовательно, придется избегать применения таких модулей, как Windows, Co- mObj,  ComServ,  ActiveX и  AdoDb,  а  также  таких  специфических для  платформы WIN32 функций API, как RaiseLastWin32Error(), Win32Check() и так далее. Кро ме того,  существует много  технологий Delphi  6, которые не доступны  в Kylix 1, но бу дут, вероятно,  присутствовать в будущих версиях Kylix. К ним  относятся DataSnap, BizSnap (SOAP) и WebSnap.

Особенности языка и компилятора

Хоть оба компилятора, Delphi и Kylix, рассчитаны на архитектуру процессора x86, между ними  существует  множество принципиальных различий, о которых необходи мо помнить при создании переносимых приложений.

Директива условной компиляции LINUX

Компилятор Kylix отрабатывает участки  кода, помеченные в директиве условной компиляции  (conditional define) $IFDEF идентификатором LINUX, а Delphi  —  участки кода,  помеченные идентификатором MSWINDOWS или  WIN32. Таким  образом, дирек тива условной  компиляции ($IFDEF) позволяет объединить в одном файле исходного кода участки,  предназначенные для обработки на разных платформах различными компиляторами. Такой  код может иметь следующий вид:

{$IFDEF LINUX}

// Здесь расположен код, предназначенный для Linux

{$ENDIF}

{$IFDEF MSWINDOWS}

// Здесь расположен код, предназначенный для Windows

{$ENDIF}

Так как идентификатор LINUX определен только  в Kylix, его компилятор отрабо тает  блок  {$IFDEF LINUX}..{$ENDIF}, но  не  сможет   отработать блок  {$IFDEF MSWINDOWS}..{$ENDIF}, поскольку  идентификатор MSWINDOWS в Kylix не определен. Аналогично работает и компилятор Delphi, только  в этом  случае будет определен идентификатор MSWINDOWS.

Формат PIC

Компилятор Linux  создает  исполняемые файлы в формате PIC (Position Independent Code), который несколько отличается от  формата исполняемых файлов, создаваемых компилятором Windows. Если код написан только  на языке  Pascal, то это отличие может быть незначительным или вовсе отсутствовать, но ассемблерные вставки  и компоновка с внешними ассемблерными модулями может  привести к поистине драматическим послед ствиям.  Кроме  того,  формат PIC требует, чтобы  доступ ко всем глобальным данным  был организован относительно регистра EBX. Например, следующая строка кода в Delphi

mov eax, SomeVar

для формата PIC будет написана так:

mov eax [ebx].SomeVar

Из за жесткой привязки к регистру EBX, код PIC требует, чтобы  значение регистра EBX сохранялось при  вызове  функций  и восстанавливалось перед  внешними обращениями. Используя  директиву условной  компиляции $IFDEF, можно, при  необходимости, отде лить ассемблерный код, специфичный для компилятора PIC, от остального кода:

{$IFDEF PIC}

// Здесь расположен код PIC

{$ENDIF}

Соглашения о вызовах

Заметим, что  соглашения о вызовах stdcall и safecall в Kylix не существуют. В Kylix функции таких  директив выполняет соглашение о вызовах cdecl. Но это соз даст проблемы только  в том случае, если проект содержит ассемблерный код, завися щий от порядка передачи параметров или очистки стека.

Несколько мелочей

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

•  В Linux не существует понятия имен диска (C:).

•  В Linux разделитель каталогов представляет собой наклонную черту вправо (/), а не влево (\), как у Windows. Для этого  случая Delphi  располагает специальной константой, PathSeparator, которая принимает необходимое значение в за висимости от платформы.

•  В Linux  разделитель списка  каталогов представляет собой  двоеточие (:),  а не точку с запятой (;) как у Windows.

1

 

•  Пути имен UNC  существуют только  в Windows.

•   Избегайте указания  пути каталогов в абсолютном виде,  поскольку  они  зависят от платформы. Например c:\winnt\system32 или /usr/bin.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии