Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизПроблемы с абстрактными методами Найти похожие ветки
← →
NewDelpher © (2004-10-05 14:37) [0]есть у меня класс
TClassAb = class
public
procedure my_method; dynamic; abstract;
end;
есть его наследник:
TMyClass = class(TClassAb)
public
procedure my_method; override;
end;
есть процедура:
procedure test(cl: TClassAb);
begin
cl.my_method;
end;
и объект:
var MyClass: TMyClass
Когда делаю вызов в модуле test(MyClass) всё замечательно работает, но стоит только поместить этуprocedure test
в DLL-шку происходит AV при обращении к ней... Что я неправильно делаю?
← →
KSergey © (2004-10-05 14:52) [1]Боюсь проблема совершенно в другом месте, надо подробнее смотреть что там и как.
Уберите все эти иерархии - боюсь, проблема останется. Не там роете, по-моему.
← →
KSergey © (2004-10-05 14:52) [2]Думаю ключевые слова "но стоит только поместить эту procedure test в DLL-шку".
← →
Суслик © (2004-10-05 14:58) [3]sharemem в uses есть?
← →
NewDelpher © (2004-10-05 15:02) [4]
> KSergey © (05.10.04 14:52) [2]
> Думаю ключевые слова "но стоит только поместить эту procedure
> test в DLL-шку".
вот код из DLL:
lybrary dll_pro;
uses LybraryClass; // это модуль, который абстрактный класс содержит
procedure test(Cl: TClassAb); export;
begin
Cl.my_method;
end;
exports test name "Тестовый";
begin
end.
/CODE>
Вроде ничего криминального...
← →
NewDelpher © (2004-10-05 15:03) [5]
> Суслик © (05.10.04 14:58) [3]
> sharemem в uses есть?
нет, а что?
← →
KSergey © (2004-10-05 15:06) [6]Вообще экземпляры объектов, конечно, лучше бы не передавать...
К стати, что в этом my_method? Более того, если пустить в отладчике - рубится прямо на вызове или все же внутри метода? Надо бы уточнить...
Ну и, надеюсь. описания классов идентичны для dll и хост-приложения? ;)
> [5] NewDelpher © (05.10.04 15:03)
> > Суслик © (05.10.04 14:58) [3]
> > sharemem в uses есть?
> нет, а что?
Читаем комментарии к проекту dll, вот что ;)
Хотя пока об этом рано еще говорить, может и не в том дело
← →
WondeRu © (2004-10-05 15:12) [7]NewDelpher © (05.10.04 15:02) [4]
exports test name "Тестовый";
ты б еще на японском написал
← →
WondeRu © (2004-10-05 15:16) [8]соглашусь с [6], нужно в таких случаях применять интерфейсы
← →
Суслик © (2004-10-05 15:18) [9]
> [6] KSergey © (05.10.04 15:06)
> Читаем комментарии к проекту dll, вот что ;)
> Хотя пока об этом рано еще говорить, может и не в том дело
просто это самая встречающаяся ошибка :)) вот и предположил
← →
NewDelpher © (2004-10-05 15:21) [10]
> Вообще экземпляры объектов, конечно, лучше бы не передавать...
> К стати, что в этом my_method? Более того, если пустить
> в отладчике - рубится прямо на вызове или все же внутри
> метода? Надо бы уточнить...
процедура Test начинает выполняться, но рубится при вызове Cl.my_method:
"Неизвестное программное исключение"
← →
NewDelpher © (2004-10-05 15:23) [11]
> WondeRu © (05.10.04 15:12) [7]
> NewDelpher © (05.10.04 15:02) [4]
> exports test name "Тестовый";
> ты б еще на японском написал
С русскими буквами всё работает. Написал на англицком - всё равно не помогло.
← →
NewDelpher © (2004-10-05 15:24) [12]
> NewDelpher © (05.10.04 15:23) [11]
имел ввиду, что не от этого ошибка
← →
WondeRu © (2004-10-05 15:37) [13]проверь в длл, чему равен Cl, думаю что nil
вставь проверку:
if assigned(cl) then cl.my_method
← →
NewDelpher © (2004-10-05 15:46) [14]
> проверь в длл, чему равен Cl, думаю что nil
>
> вставь проверку:
> if assigned(cl) then cl.my_method
проверил, действительно, почему-то nil, хотя я же передаю объект в параметре.
← →
NewDelpher © (2004-10-05 16:05) [15]Получается объект невозможно передать параметром в Dll?
← →
WondeRu © (2004-10-05 16:51) [16]попробуй
uses LybraryClass, ShareMem;
← →
NewDelpher © (2004-10-05 16:58) [17]
> WondeRu © (05.10.04 16:51) [16]
> попробуй
> uses LybraryClass, ShareMem;
подключил, и что надо с ней делать?
← →
Anatoly Podgoretsky © (2004-10-05 17:02) [18]NewDelpher © (05.10.04 16:58) [17]
А ничего, это по определению работать не будет.
Лучше прочитай комментарий, который Дельфи тебе вставило в ДЛЛ и следуй ему.
← →
NewDelpher © (2004-10-05 17:07) [19]
> Anatoly Podgoretsky © (05.10.04 17:02) [18]
Извините за ламерство, но не подскажете ли ВЫ что это за комментарий и где его прочесть?
← →
WondeRu © (2004-10-05 17:08) [20]Anatoly Podgoretsky © (05.10.04 17:02) [18]
ээээ , ну даuses ShareMem, LybraryClass;
← →
NewDelpher © (2004-10-05 17:16) [21]это тот комментарий, что DLL-Wizard вставляет? Прочитал.
> uses ShareMem, LybraryClass;
сделал, все равно nil
← →
NewDelpher © (2004-10-05 17:34) [22]с этим ShareMem не надо ничего делать?
← →
KSergey © (2004-10-06 15:31) [23]> NewDelpher © (05.10.04 15:46) [14]
> проверил, действительно, почему-то nil, хотя я же передаю
> объект в параметре.
Честное слово, сильные сомнения по поводу выделенного. Все равно передается указатель, если уж он есть - то он передасться. И никакая ShareMem тут ни при чем, по-моему.
В коде ошибка. Проверьте в хост-приложении значение той перемнной, что передается в dll перед самым вызовом test.
← →
Erik1 © (2004-10-06 16:38) [24]Насколько я помню TClassAb в Dll и в основной программе будут разные классы. Так что передавать сылки на объект плохой тон. Просто примерись с этим, даже судба против такого стиля програмирования.
← →
WondeRu © (2004-10-08 17:57) [25]Erik1 © (06.10.04 16:38) [24]
Просто примерись с этим
и используй интерфейсы
← →
jack128 © (2004-10-08 18:45) [26]WondeRu © (08.10.04 17:57) [25]
или bpl
Страницы: 1 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.035 c