Экспорт класса в мульти-DLL-приложении

Разработка программ на пес его знает на чем
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуйте!

С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_
!*********
Реализация может быть в составе любого .CLW модуля, имя этого модуля указывается в MODULE декларации класса. Но лучше, конечно для класса (или набора классов) создать свой модуль. Модуль этот должен быть в составе проекта .DLL (dll_mode = 1) или .LIB (dll_mode = 0)

Код: Выделить всё

!*********
! MyClass.clw
!*********
  MEMBER
  INCLUDE('MyClass.inc'),ONCE

  MAP.
!*********
MyTestClass.MyMethod
 CODE
 MESSAGE('MyMethod')
!*********
Добиться такого разделения можно разными путями (Clarion, увы стандартно в своей 16-БИТНОЙ среде ДО СИХ ПОР НЕ ПОДДЕРЖИВАЕТ КЛАССЫ). А хоть бы и вручную или с помощью freeware Object Writer от CapeSoft.

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)
Ответить