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

Вниз

Проблемы с абстрактными методами   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.051 c
3-1096469759
Ivan_
2004-09-29 18:55
2004.10.24
Обновление информации у всех пользователей


6-1092379795
Дмитрий Ботвин
2004-08-13 10:49
2004.10.24
Список служб на удаленном компьютере


1-1097407168
exe
2004-10-10 15:19
2004.10.24
Color


14-1096756061
KilkennyCat
2004-10-03 02:27
2004.10.24
Куда в Питере можно сдать старые компы?


1-1096497679
Defunct
2004-09-30 02:41
2004.10.24
Exception: Not enough storage is available to process this ..





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