Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

Интерфейс для передачи класса в dll   Найти похожие ветки 

 
alolya   (2007-12-04 00:09) [0]

добрый день. Суть проблемы такова. В книжке нашел пример:

procedure IsFont (O:TObject);
begin

if O is TFont then
ShowMessage ("Font")
else ShowMessage ("Not Font");
end;

Когда данный пример в главной форме то все работает корректно, но стоит его поместить в dll и добавить в ней строчку:

exports IsFont name "IsFont";

потом вызвать функцию из главного модуля, так перестает работать. В книжке написано, что так и должно быть и спасение нужно искать в интерфейсах.

   Может что-то не так делаю, но создал в той же dll класс и описал в нем интерфейс, в котором и вышеупомянутую функцию + ее реализация в классе. и сделал экспорт функции, которая создает этот класс, чтобы из главного модуля можно было юзать интерфейс. снова вызываю из главной формы  указатель_на_класс_в_dll. IsFont (Tfont) , и всё равно не работает.


 
Leonid Troyanovsky ©   (2007-12-04 00:42) [1]


> alolya   (04.12.07 00:09)  

> Когда данный пример в главной форме то все работает корректно,
>  но стоит его поместить в dll и добавить в ней строчку:

http://www.podgoretsky.com/DM/BadTips.html

--
Regards, LVT.


 
Германн ©   (2007-12-04 01:18) [2]


>  Может что-то не так делаю, но создал в той же dll класс
> и описал в нем интерфейс, в котором и вышеупомянутую функцию
> + ее реализация в классе. и сделал экспорт функции, которая
> создает этот класс, чтобы из главного модуля можно было
> юзать интерфейс. снова вызываю из главной формы  указатель_на_класс_в_dll.
>  IsFont (Tfont) , и всё равно не работает.
>

И именно поэтому и не работает.
BadTips :-)


 
Юрий Зотов ©   (2007-12-04 01:29) [3]

> alolya   (04.12.07 00:09)  

> В книжке написано, что так и должно быть

Правильно написано. Проекты EXE и DLL компилировались по отдельности, поэтому для одного и того же класса в каждом проекте - своя VMT. И получается, что это два разных класса.

> и спасение нужно искать в интерфейсах.

А вот этого в книжке не написано. В ней написано, что спасение надо искать в COM-технологии, а не просто в интерфейсах.

Опишите задачу подробнее. Возможно, есть смысл отказаться от DLL и использовать BPL, или все компилировать с run-time пакетами. А может и правда, COM подойдет лучше всего. От самой задачи зависит.


 
alolya   (2007-12-04 23:52) [4]

прочитал ссылку + материал на других форумах по моему вопросу. кругом советуют bpl, попробую на выходных заюзать. Точно задачу не могу описать. так как хотелось с помощью интерфейса затащить вышеприведенный код в dll и чтобы он корректно работал. Но если я правильно уяснил, через интерфейся нельзя переадавтаь классы, указатели на них, на массив. А только опредленного типа параметры. И нужно сводить все параметры именно к этим типам, так к примеру если нужно передать массив , то передать его ввиде строки, или полементно как int, float . если что-то с классом сделать, то вызвать метод интерефейса без параметров или с разрешенными , который в самой Dll сделает все что нужно сам.

тогда у меня еще вопрос, соввсем не ясно 1-2 стрчоки кода,  а в третьей не пойму где реализован интерфейс, как я уяснил, интерфейс это всего лишь методы, которые потом реализуются в классах. Класс вижу , вижу интерфейс, а реализации его (интерфейса) методов нет. Или так можно, и программа сама найдет в подключенном модуле где лежит реализация методов интерфейса, а класс TSequentialStreamAdapter не должен об этом заботиться, он получит в дополнение расширенные методы, за счет присоединенного интерфейса

спасибо.

type

TMethodDataSetOpen = procedure of object;

TFetchRowEvent = procedure(cRowsObtained: UInt) of object;

TSequentialStreamAdapter = class(TStreamAdapter, ISequentialStream)

end;


 
alolya   (2007-12-04 23:55) [5]

И в догонку, если dll и exe будут компилиться в одном приложении, то есть шанс передать класс? или что это даст помимо одной таблицы памяти? передать указатель на класс, а в dll тогда по нему обратиться?


 
Ins ©   (2007-12-05 00:07) [6]


> кругом советуют bpl


Это действительно самое простое и полностью работоспособное решение. Но если оно по некоторым причинам не устраивает, могу предложить свой нестандартный вариант вытаскивания классовых ссылок из исполняемых модулей. Практика показывает, что он работает на всех версиях Delphi по крайней мере начиная с D5 по D2007, но полностью построено на недокументированных фишках, есть некоторые ограничения, так что использовать на свой страх и риск. Интересует после такой антирекламы? :)


 
Юрий Зотов ©   (2007-12-05 00:07) [7]

> alolya   (04.12.07 23:52) [4]
Прочитал, но не понял. Поэтому сказать ничего не могу.

> alolya   (04.12.07 23:55) [5]

> если dll и exe будут компилиться в одном приложении

Это невозможно. DLL и EXE - это два РАЗНЫХ проекта, каждый из них компилируется сам по себе.

Но если DLL и EXE компилировать с включенной птичкой "with runtime packages", то можно будет и классы передавать, и их экземпляры - как будто это действительно одно приложение. То же самое, если вместо DLL использовать BPL.


 
alolya   (2007-12-06 01:03) [8]

хорошо попробую через bpl и с галочкой. о результатах отпишусь. может кому пригодиться.

А про [4 ] посоветовали про процедурные типы почитать



Страницы: 1 вся ветка

Текущий архив: 2007.12.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1196763788
Alexandr Malygin
2007-12-04 13:23
2007.12.30
динамическое создание/удаление компонент


2-1196851391
Максим
2007-12-05 13:43
2007.12.30
DLL


15-1196450055
Dmitry_177
2007-11-30 22:14
2007.12.30
помогите плиз! не опредесяется внешний жесткий диск


15-1196438884
QWE
2007-11-30 19:08
2007.12.30
Хочется поучаствовать в разработке реального проекта


1-1192084366
botaniQ
2007-10-11 10:32
2007.12.30
Возможен ли запуск *.CHM с параметром главы?