Форум: "Начинающим";
Текущий архив: 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