Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизКак экспортировать класс из dll. Найти похожие ветки
← →
Kolan © (2005-05-25 10:05) [0]Здравствуйте,
Может я чего-то сейчас не то спрошу, но...
Хочу переделать проект с использованием dll. Для этого хочу (если это возможно) описать класс в dll НапримерTMyDllClass
и экспортировать его. Те в оболочке я бы хотел иметь.var
MyDllClass: TMyDllClass;{TMyDllClass описан в dll}
Как это сделать.
PS Достаточно ссылки на пример... :)
← →
Digitman © (2005-05-25 10:10) [1]для этого существуют ран-тайм-пакеты (в bpl модулях), содержащие обычные dll для этой задачи не подойдут - компилятор не размещает в них никакой инф-ции о типах
← →
Forester © (2005-05-25 10:10) [2]Так не получится. Из dll нельзя получить RTTI информацию. Если необходим такой подход используйте bpl библиотеки.
← →
Kolan © (2005-05-25 10:17) [3]Просто я хочупотом получит возможность как-бы обновить версию заменив файл. Bpl для этого подойдет? Мож у вас ссылки есь хорошие что-бы для новичков были?
← →
evvcom © (2005-05-25 10:19) [4]bpl пойдет
← →
Cash © (2005-05-25 10:28) [5]Так, а юзать из проги в таком случае BPL-ку как?
← →
Cash © (2005-05-25 10:42) [6]Товарищ Kolan, если вам все еще не охота угодить от DLL, то вот предложение.
Естественно, клас с методами базировать в DLL, но не экспортировать его, а по средствам процедуры создавать его с последующей передачей адреса хозяину.
Типа:
Procedure CreateControl(Perem: TMyDllClass);
...
exports
CreateControl;
Такой метод у меня всегда выходил.
При этом Класс базировать в отдельном модуле, и подключать его надо и к проге, и к DLL.
← →
Kolan © (2005-05-25 10:53) [7]Т.е. если я првавильно понял, то ты предлагаешь написать класс, и подключать его. Так а если я захочу переделать его полностью? Его-же компилить предется. А я хочу не компилить, файл переписал и сё.
Зы А что такое dpl? На delphiworld нашел работу с dpl.
← →
evvcom © (2005-05-25 10:54) [8]
> Так, а юзать из проги в таком случае BPL-ку как?
Так же как юзается стандартная VCL в случае использования пакетов.
← →
Digitman © (2005-05-25 11:08) [9]
> Так а если я захочу переделать его полностью? Его-же компилить
> предется
а RTTI и VMT с потолка не свалятся - их как раз компилятор и формирует
> А я хочу не компилить, файл переписал и сё
если "и сё", тогда смело можешь удалить исп.файл компилятора из каталога Делфи - он только лишнее место занимает)
← →
Cash © (2005-05-25 11:19) [10]> Так а если я захочу переделать его полностью?
А с какой стати, разработай устойчивую систему методов для своего класса. Если добавлять или удалять методы, то тебе в любом случае придется перекомпилить проект вместе с DLL, то же будет в случае BPL.
Смотри!
Есть набор из примерно десяти методов класса.
Прога знает о всех десяти и знает, что с этим делать.
Берем и убираем два, перекомпилим DLL или BPL.
Прога всеравно знает о десяти, если ты не предусмотришь обратное.
Прога обращается к одному из несуществующих, и отгадай с трех попыток что с ней будет?
Делаем отсюда вывод:
Методы и Свойства у класса должны быть одни от версии к версии, методы не удалять или добавлять, а модернизировать!
Я бы в этом случае предусмотрел спец. процедуру или метод для узнавания что в этой версии активно, а что нет.
← →
evvcom © (2005-05-25 16:06) [11]
> А я хочу не компилить, файл переписал и сё
Тогда на интерпретатор переходи :)
← →
Kolan © (2005-05-25 16:41) [12]Вот чего я хочу(не знаю можно так или нет).
Вот пример: в пакете описан некий класс пусть у него будет поле масивв и методы заполняющие его. В этом классе всегда есть
функцияЗаполнитьМассив
. А тип массива или алгоритм заполняющий его может быть лубой. Смысл в том что я в программе оболочке подключаю этот пакет(как не знаю) и описываю переменнуюvar
MyArray: TMyAarray <- "этот тип из пакета.
и могу вызвать методMyArray.ЗаполнитьМассив
.
который запонит массив.
Те Я смогу сделать например пакет с массивом типа Int и с массивом типа Real. А потом просто менять пакеты и получать разную функциональность. Не меняя оболочку.
Конечно функции-"интерфейсы", которые одинаковые для любого пакета я сделаю одинаковыми.
PS
Вот нашел
http://delphiworld.narod.ru/base/plugins.html
http://delphiworld.narod.ru/base/little_about_plugins.html
"Это то" © ?
PPS
А вы ссылки не кидаете так как не понимаете чего я хочу?
← →
evvcom © (2005-05-25 16:50) [13]А exe с твоим массивом как будет работать? Как с integer или как с real? Если через твою же dll, то реализуй как хочешь, хоть совсем без массива. Только не обращайся тогда из exe к этому "массиву" напрямую.
← →
Digitman © (2005-05-25 16:59) [14]
> вы ссылки не кидаете так как не понимаете чего я хочу?
да неее .. просто наживка к вечеру прокисла)
← →
Kolan © (2005-05-25 17:00) [15]Конечно через тот класс из пакета(>через твою же dll так вроде бы вы сказали что нельзя через dll).
> Только не обращайся тогда из exe к этому "массиву" напрямую.
У да не буду обращатся.
Вы правда не поняли что я хочу? Трудно обяснить когда не знаещь как это называется и как это делается. Поэтому и прошу ссылок.
Поторюсь может но, Я хочу создать некое ядро состояшие из нескольких пакетов... Меж собой и между оболочкой пакеты общяются по установленным провилам. А начинка у пакетов любая лишь бы правила обшения соблюдались. И соответственно оболочка тоже любая лищь бы поддерживала заданные протоколы.
PS Нужели я первый кто такое захотел сделать?
← →
Eraser © (2005-05-25 17:04) [16]Kolan © (25.05.05 17:00) [15]
Кто мешает осчатца при помощи экспортируемых ф-й или сообщений?
← →
Cash © (2005-05-25 17:26) [17]> [12]
Товарищ Kolan, а я то пытался тебе разложить все по полочкам,
Блин, е мое :), да я ж именно это в двух мессагах втолковать пытался.
Да, е мое, именно это, делай класс внутри библиотеки, масив свой в Private области, тольео, лиш бы его видно не было, метды пусть одинакоы будут, только с начинкой рахной.
Прога твоя по отношению к этой DLL консольной казаться должна.
Типа, тупо выполняет рад задач из комплекса поставляемых DLL.
А то, что ты скомпилил прогу с когдато давнешним классом, да ее это не колышит, Методы то есть, Свойства то есть, и все на своих местах, и с теми же аргументами, и тех же типов.
А по другом нельзя!
← →
Kolan © (2005-05-25 17:31) [18]
> Eraser © (25.05.05 17:04) [16]
Ни кто не мешает я просто не хочу заложить плохую основу. А хочу сделать так, чтобы без переделывания оболочки коректировать работу программы заменой этих пакетов.
Приближусь к конкретной задаче. Я сделал программу работающую с устройством. Она производить измерение, стороит график итд.
СейчасИЗМЕРЕНИЕ
- у мея это просто массив(график), и массив значений(результат измерения - разные величины типа ёмкости...).
Я решщил всё переделать. А именно сделать dll с протоколом обшения с устройством. Dll с математической обработкой.
С этим я наверно справлюсь.
И сделать КлассИзмерение
где будут поля результатов, массив с графиком. Мне потом легко будет массив таких измерений сделать и работать с ним. Но хочу чтобы изменение этого класса не требовало лесть в оболочку и та что-то править.
В оболочке я раз и навсегда сделаю допустим массив измерений
Var
Measurment: array[1..10] of TMeasurment;
Кроме того оболочка знает что у класса TMeasurment обязательно есть методGetMeasurment: TString;
То что вернет этот метод оболочка добавляет в Grid (делает с ним что угодно, её задача грубоговоря только показать пользователю).
Теперь допустим у меня в пакете версии 1.0 было 10 выходных значений.
А потом мне понадобилось вычислить еще 1. Так если у меня всё в пакете то я не лезу в оболочку а делаю пакет версии 1.1.
А методGetMeasurment: TString;
Вернет 11 сторо а не 10. Ну и что оболочки пофиг, сколько сторк бкдет столько и выведет.
Я просто хочу на верный(пусть сложный) путь стать. Чтобы потом время потраченое не пропало.
← →
Eraser © (2005-05-25 17:33) [19]Kolan © (25.05.05 17:00) [15]
Поторюсь может но, Я хочу создать некое ядро состояшие из нескольких пакетов... Меж собой и между оболочкой пакеты общяются по установленным провилам. А начинка у пакетов любая лишь бы правила обшения соблюдались. И соответственно оболочка тоже любая лищь бы поддерживала заданные протоколы.
PS Нужели я первый кто такое захотел сделать?
VCL, ..., COM, .NET.
← →
Eraser © (2005-05-25 17:34) [20]Kolan © (25.05.05 17:31) [18]
Не совсем вник в то что ты написал, но думаю интерфейсы то что надо.
← →
Kolan © (2005-05-25 17:41) [21]
> Cash © (25.05.05 17:26) [17]
Я кажись примерно понял что ты говоришь.:
Или нет?library Project2;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes;
type
MyClass = class
private
FMyArray: array[1..10] of Integer;
protected
public
constructor Create;
function GetArrayElem(Element: Integer): Integer;
end;
{$R *.res}
constructor MyClass.Create;
begin
end;
function MyClass.GetArrayElem(Element: Integer): Integer;
begin
Result := FMyArray[Element];
end;
exports
MyClass.GetArrayElem;А экспортировать то что?
begin
end.
← →
Kolan © (2005-05-25 17:45) [22]
> Eraser © (25.05.05 17:33) [19]
Как бы обяснить то чтоб потом опять не преределывать.
Вот часто говорят есть ядро есть оболочка что такое тогда ядро и как его делать? Это каждый сам для себя решает?
PS
.Net - Нет та как D7
← →
Cash © (2005-05-25 18:04) [23]> Kolan © (25.05.05 17:41) [21]
НЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕТ!!!!!!!!!!!!!!!!!!!!!!!!
НА, СМОТРИ: :)))
Unit TClassUnit;
interface
uses
<bla... bla... bla...>
Type
TMyClass = class
Private
FData: array [1..10] of <что захочеш!>
Public
Constructor Create;
Procedure SetData(Index: integer; aData: Double);
end;
implementation
<bla... bla... bla...>
end;
----------------------------------------------------------------
library Project2;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils, TClassUnit,
Classes;
{$R *.res}
Function CreateClass: TMyClass; stdcall;
begin
Result:=TMyClass.Create;
end;
exports
CreateClass;
begin
end.
А теперь меняй начинку TMyClass и перекомпиль DLL, и все!
Что до Double, а я его выбрал за то, что большой.
Внутри метода можно и подкорректировать его под целочисленный стандарт.
← →
Kolan © (2005-05-25 18:14) [24]Понял теперь что ты хочешь. Интересно правильно ли это...
Ты это сам придумал али как? :)
> Eraser © (25.05.05 17:34) [20]
Не совсем вник в то что ты написал, но думаю интерфейсы то что надо.
Ну линк дай...
← →
Cash © (2005-05-26 16:06) [25]Sory за отсуцтвие, у меня провайдер с московским каналом.
> Kolan © (25.05.05 18:14) [24]
Работает, еще как, сам делал, получается.
Получалось даже когда передавал обратно, в прогу, не адрес объекта, а запись с пакетом методов навроде нажатий на кнопку или ввода текста в Едит. Работает.
← →
isasa © (2005-05-26 17:59) [26]exports
MyClass.GetArrayElem;
function GetArrayElem(Element: Integer): Integer;
Скорее всего, просто так работать не должно.
При вызове нужно учитывать, что реально точка входа в метод описана как,
function GetArrayElem(self: pointer; Element: Integer): Integer;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.041 c