Дмитрий Суходоев
raven66@mail.ru
Сначала хочу немного рассказать про этот самый Virtual Pascal 2.0. Все таки для пользователей Win32 - это довольно неизвестный компилятор. Первая версия этого компилятора была разработана в Киевском Институте Кибернетики Виталием Мирьяновым (хотя институт тут помог только тем, что предоставлял машины для работы). Большая часть ядро Virtual Pascal была написана на i386 с 4 мегобайтами памяти и поэтому была даже для того времени очень оптимизирована. В июне 1995 была выпущена публичная бета версия Virtual Pascal для OS/2, и тогда с Виталием связалась британская компания fPrint в лице Аллана Мертнера и предложила свою помощью в разработке и поддержке продукта и место жительства в UK. В итоге у них получился Virtual Pascal v1.11 для OS/2. Сейчас уже доступен релиз Virtual Pascal 2.0, который насчитывает всего около 200 пользователей. Здесь я не считаю тех пользователей, которые украли, этот прекрасный компилятор.
Самая главная особенность, которая меня привлекла в Virtual Pascal 2.0 это его почти 100% совместимость с таким достаточно известном компилятором Borland Pascal 7.0, а также одновременная (частичная) совместимость с Borland Delphi 3, с использованием классов. Нельзя не упомянуть то, что в Virtual Pascal вложены скомпиленная библиотека Turbo Vision 2.0, а также патчи для стандартных исходников от Borland и патчи для библиотеки Object Professional 1.30 от Turbo Power Software.
При первых попытках написания простого плагина на Virtual Pascal 2.0 я, естественно, столкнулся с тем, что мне нужен был аналог plugin.hpp, но для паскаля. FarIntf.pas не подходил, по тем причинам, что он был достаточно неплохо заточен под Borland Delphi 4, что вобщем-то и осложнило его компиляцию под Virtual Pascal 2.0. короче говоря - собрать я собрал, а вот работать оно не захотело :-)
Ну немного побездельничав, попросил у Василия Мошнинова исходники аналога plugin.hpp в его варианте и небольшой hello world тоже для его plugin.pas. После небольшой правки все заработало на «ура», что подтолкнуло меня сделать то чего мне так давно в FAR не хватало.
Особых отличий написания плагинов на Virtual Pascal 2.0 от дельфи нет,
но все таки есть такая обязательная комбинация директив компилятора, без
которых собрать что-либо работающее на Virtual Pascal 2.0 для FAR будет
просто невозможным.
unit Use32;
{$Use32-}
interface
type
{$IfDef Use32}
Integer = System.Longint;
Word = System.Longint;
const
MaxInt = MaxLongint;
{$Else}
SmallInt = System.Integer;
SmallWord = System.Word;
{$EndIf}
type
PByte = ^Byte;
PWord = ^Word;
PLongint = ^Longint;
PSmallInt = ^SmallInt;
PSmallWord = ^SmallWord;
implementation
end.
{&AlignRec+,Z+}
{&H+,Use32+,Z+,AlignRec+}
WriteLn для
модуля Crt, etc..), можно сделать с помощью ФАРовского api. То есть в
ФАРовских плагинах надо делать begin, а initialization только для отладки,
например для вывода отладочного текста в лоб с помощью процедур Write и
WriteLn. При постановке initialization в dll у меня было замечено довольно
странное поведение некоторых моих плагинов, в частности, true macro
редакторе совершенно от балды выдавал откуда-то макросы, причем там, где
их не должно было быть. Когда поставил begin - стало все нормально.
Что касается использования библиотеки Turbo Vision 2.0 for Win32 в
плагинах. Для нее как раз нужно ставить initialization. Почему? Если
стандартный модуль drivers.pas не проведет инициализацию, то в лучшем
случае у Вас ничего не запустится. В худшем будет просто gpf ;-) Но одного
initialization вообще всегда мало. Инициализация, выделение памяти прошло.
А кто же будет высвобождать эту память? В обычном exe этим занимается
ExitProc - указатель на процедуру деинициализации. В dll он тоже есть, но
почему-то при выгрузке он не вызывается. Возможно, это баг Virtual Pascal.
Поэтому нужно импортировать ФАРу процедуру ExitFAR и там насильно вызывать
ExitProc. Я делаю это так:
procedure ExitFAR; assembler; asm call ExitProc; end;
Дальше идут необязательные советы, без них работать уже будет, но с ними
просто легче.
{&StdCall+} и все процедуры и функции,
которые будут за ней идти будут подразумеваться как stdcall.
Кстати сказать, что именно с помощью Virtual Pascal 2.0 намного лучше и экономичней компилять плагины. И не только к ФАРу. Вот я читаю PLUGINSR.HLP и сочувствую наСИльникам: всегда надо как-то извратиться, чтобы получить маленький размер плагина. На дельфи тоже самое, но там уже проще: можно выкинуть модуль SysUtils и спокойно себе скомпилять плагин небольшого размера, другое дело, что без SysUtils в дельфи ничего не сделаешь. А на Virtual Pascal 2.0 самое то! SysUtils в нем тоже есть, но в отличии от дельфи без SysUtils в Virtual Pascal 2.0 можно прожить, да причем прожить припеваючи! Есть все для этого замены: модуль Dos (для работы с диском), модуль Strings (для работы с pChar), а большего от SysUtils никто и не требовал, т.к. исключения (exceptions) плагинам по-моему мнению совсем не нужны. Наконец в Virtual Pascal 2.0 есть Turbo Vision для Win32, что дает более гибкие возможности по сравнению со стандартными ФАРовскими диалогами. Применение его в плагинах уже дает замечательные результаты (смотри плагины rAscii, color selector).
Модуль plugin.pas Василия Мошнинова был несколько переделан мной на лад Virtual Pascal 2.0, туда я добавил функции для работы с реестром, для обработки масок. Смысла здесь их публиковать я не вижу, кому интересно может взять архив с модулем на моей страничке.
Почти там же лежат интерфесы для работы с регулярными выражениями используя плагин Игоря Русских Colorer 3.0. Оно тоже переписано мной для Virtual Pascal 2.0, но при достаточной сноровке это запросто можно собрать с помощью какой-нибудь из семейства дельфей. Лежит тут.
(c) raVen
21.02.2000
Rev 30.04.2000