Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Вниз

Интерфейс для передачи класса в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
2-1195211860
Yurij-7
2007-11-16 14:17
2007.12.30
Помогите с запросом


15-1196191309
Anatoly Podgoretsky
2007-11-27 22:21
2007.12.30
Заветы, советы и КИ и тормоза


15-1196462270
Petr V. Abramov
2007-12-01 01:37
2007.12.30
.Net 2-й fw


15-1195640433
VICTOR_
2007-11-21 13:20
2007.12.30
Не запускается Turbo Delphi 2006


2-1196721513
ZGadget
2007-12-04 01:38
2007.12.30
Отделение текста от бинарника





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский