С55H, ABC
Есть мульти-DLL-приложение (несколько DLL и основной модуль EXE). В одну из DLL(глобальную) включены описания ABC-классов, Template globals и основных процедур, а в остальных DLL (включая и EXE) эти описания генерятся как EXTERNAL.
Требуется экспортировать класс, описанный в глобальной DLL со всеми методами и свойствами, в другую DLL. С переменными делал так. В той DLL, в которой я хотел видеть переменную, описывал ее как EXTERNAL, DLL(dll_mode). Попробовал это применить и на классе
Cl CLASS,EXTERNAL,DLL(dll_mode)
END
, но так не видны его свойства и методы. Подскажите, пожалуйста, как правильно объявлять внешний класс, а то я в первый раз коснулся этой ситуации.
С уважением, Семен Попов.
(Добавление)
1. Для начала надо разделить декларацию и реализацию класса, декларации обычно выносят в файл .INC, например
Код: Выделить всё
!*********
! MyClass.inc
!*********
OMIT('_EndOfInclude_',_MyClass_)
! Для предотвращения повторного объявления класса
_MyClass_ EQUATE(1)
MyTestClass CLASS,TYPE,MODULE('MyClass.clw'),EXTERNAL,DLL(dll_mode)
MyProp LONG
MyMethod PROCEDURE
END
_EndOfInclude_
!*********
Код: Выделить всё
!*********
! MyClass.clw
!*********
MEMBER
INCLUDE('MyClass.inc'),ONCE
MAP.
!*********
MyTestClass.MyMethod
CODE
MESSAGE('MyMethod')
!*********
2. Сделав такое естественное разделение мы можем использовать заголовочный файл MyClass.inc в других модулях нашего проекта, для этого достаточно объявить в этом модуле
INCLUDE('MyClass.inc'),ONCE
Лучше наверное делать такие объявление в главном модуле EXE или DLL, там где вы намерены использовать ваш класс.
3. Самая, пожалуй, труднореализуемая деталь - это попросить компилятор составить экспортные описания в DLL для нашего класса. Например, для класса MyTestClass, DLL которая будет содержать его реализацию должна экспортировать сам класс MyTestClass и его публичный метод MyTestClass.MyMethod
4. Описание для экспорта DLL мы записываем в файл .EXP проекта в котором создается наша DLL содержащая класс. Если у вас .APP, то при компиляции .EXP файл формируется автоматически, но нашего класса там, увы, не будет. Значит надо внести его в .EXP самостоятельно и выполнить снова компиляцию проекта, только уже не в .APP а в обычном .PRJ (исходник .PRJ текущего .APP можно найти после компиляции в каталоге для временных файлов)
5. Получить .EXP описания для нашего класса можно так ...
Короче, написал я все это и подумал, а собственно, чего огород городить? Если не претендовать на универсальность, можно сделать свой класс по образу и подобию ABC (раз уж мы работаем на ABC ) и пусть Clarion считает его родным и горячо любимым, а сделать для этого нужно только одно: в рассмотренный нами выше файл MyClass.inc добавить комментарий
!ABCIncludeFile
в самое начало файла. И разместить оба наши файла MyClass.inc и MyClass.clw в каталоге LibSrc
Таким образом наш класс попадет естесственным образом в DLL содержащую все ABC классы, ну и ладненько.
Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
(Добавление)
Спасибо, Владимир, за исчерпывающий ответ. Помогло.
Семен Попов <oit_svp@opfr.komi.com>
Написал: ClaList(2)