Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
8-1109190242
Shamansky
2005-02-23 23:24
2005.06.14
Масштабирование видеокартинки


3-1115273164
Belkova
2005-05-05 10:06
2005.06.14
ShowModal и locate


14-1116949965
Alx2
2005-05-24 19:52
2005.06.14
Наткнулся на вирус, видимо свежий.


14-1117090203
Prohodil Mimo
2005-05-26 10:50
2005.06.14
По просьбе Автомодератора


1-1117214654
Gorger
2005-05-27 21:24
2005.06.14
В поток передаю канвас...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский