Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизКлассы Найти похожие ветки
← →
dakus (2002-12-10 11:33) [0]Необходимо вынести классы в отдельные модули
для использования в других Delphi и Cbuilder
программах.
Как я понимаю dll для этого не подходит?
Какую технологию использовать
← →
Skier (2002-12-10 11:45) [1]>dakus
Пакеты.
На этом сайте есть статья поэтому поводу...Пошукай...
← →
han_malign (2002-12-10 12:12) [2]COM, OLE, ActiveX - универсально(для Must Die), полезно разобраться, но гемморойно.
DLL - вполне подходит, но нужно грамотно строить абстрактный интерфейс:
{ObjIFace.pas}
unit ObjIFace;
interface
type TObjIFace = class
public
function Method1(...): TType1;virtual; abstract;
................
function MethodN(...): TTypeN;virtual; abstract;
end;
end;
{ObjImplementation.dpr}
library ObjImplementation;
uses
type TObjImpl = class(TObjIFace)
public
constructor Create; //абстрактный конструктор и деструктор - думаю перебор - для них обертка обычно делается
destructor Destroy;override;
function Method1(...): TType1;override;
................
function MethodN(...): TTypeN;override;
end;
constructor TObjImpl.Create;
begin ... end;
destructor TObjImpl.Destroy;
begin ... end;
function TObjImpl.Method1(...): TType1;
begin ... end;
................
function TObjImpl.MethodN(...): TTypeN;override;
begin ... end;
//обертка для конструктора и деструктора
function CreateObj: TObjIFace;
begin Result:=TObjImpl.Create;end;
Procedure FreeAndNilObj(var aObj: TObjIFace);
begin aObj.Free; aObj:=nil; end;
end.
{Main.pas}
unit Main;
implemantation
uses ObjIFace;
function CreateObj: TObjIFace;external "ObjImplementation";
Procedure FreeAndNilObj(var aObj: TObjIFace);external "ObjImplementation";
var _obj: TObjIFace;
begin
_obj:=CreateObj;
_obj.Method...
FreeAndNilObj(_obj);
end.
- соответственно определяешь абстрактный интерфей для CBilder-а, структура классов и RTTI у них с Delphi одинакова.
← →
dakus (2002-12-10 12:18) [3]to han_malign:
А наследование в программе от класса в Dll, я могу делать?
← →
dakus (2002-12-10 12:20) [4]То Skier:
если я поменял что-то в пакете, ехе нужно перекомпилять?
← →
han_malign (2002-12-10 12:43) [5]А вот это уже фигушки, только аггрегацию(спользовать оберточный класс одним из private полей которого будет импортируемый, и делать для каждого метода обертку).
Вообще DLL используется для полной инкапсуляции класса во внешней библиотеке(для PlugIn-ов скажем, вместо старого overload), для возможности наследования - 100% BPL, причем линкуемый статически.
← →
Skier (2002-12-10 13:21) [6]>dakus
> А наследование в программе от класса в Dll, я могу делать?
Существует 4 ограничения на экспорт объектов DLL :
1) Объекты должны создаваться внутри DLL
2) Host-приложение может использовать лишь виртуальные методы
класса
3) Экспортируемый объект должен быть объявлен и внутри DLL и
внутри Host-приложения, причём объявление методов и там там
должно быть строго в одном и том же порядке
4) Нельзя создавать объект-потомок из объекта в DLL
← →
dakus (2002-12-10 14:19) [7]Так какую технологию лучше использовать если:
1. нужно наследование
2. при изменении в классе, не перекомпилять exe
← →
dakus (2002-12-10 15:17) [8]Мастера, Вы где?
Помогите.
← →
han_malign (2002-12-10 15:37) [9]Никакую - наследование подразумевает повторное использование исходного кода, а значит перекомпиляцию.
З.Ы. Хотя при изменении класса в DLL, если не изменялся интерфейс, достаточно перекомпилять DLL. (выделяешь реализацию(implementation) класса в отдельный модуль(unit), если нужно делаешь новый модуль в котором наследуешься и компилишь очередную DLL с нужным модулем, или фабрику классов делаешь)
{ObjImplementation13.dpr}
library ObjImplementation13;
uses ObjImpl13;
function CreateObj: TObjIFace;
begin Result:=TObjImpl13.Create;end;
Procedure FreeAndNilObj(var aObj: TObjIFace);
begin aObj.Free; aObj:=nil; end;
end.
- при этом замена с переименованием DLL - приведет к изенению функциональности использующей программы(а-ля PlugIn), можно держать набор DLL для использования, скажем, разных девайсин, и непосредственной адаптации программного пакета для каждого конкретного клиента.
З.З.Ы. Интересно как ты хочешь пронаследовать класс в программе и при этом не перекомпилить ее???
← →
dakus (2002-12-10 17:04) [10]Меняется реализация функции set какого-либо свойства из private класса.
Вызов остался старый - зачем менять основную прогу?
И все-таки если нужно наследование, но класс
что бы был в отделном модуле, как делать?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c