Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с DLL. Метод Assign не хочет выполняться.. :(


Страницы:   1 2

Гас ©   (2002-07-16 10:01:00) 

Вот в первый раз решил поработать с DLL, все классно получалось, пока не попробовал сделать FFont.Assign(DLLReturnsFont).
Не хочет выполняться!
Пишет "Cannot assign TFont to a TFont".
В чем дело, кто-нибудь знает? Спасибо.


Юрий Зотов   (2002-07-16 18:42:00) [1]

Адрес передать не проблема, проблема в другом.

Хост-программа и DLL компилируются, как два независимых проекта. Поэтому таблица классов в них у каждого своя. TFont в контексте хоста и тот же TFont в контексте DLL - это два входа в РАЗНЫЕ таблицы - то есть, формально - два РАЗНЫХ класса. Поэтому и не срабатывает Assign - в нем не проходит проверка if Source is TFont. То же самое и со всеми остальными классами.

Этих проблем не возникает, если компилировать с run-time пакетами. В противном случае придется делать интерфейсные классы-посредники между DLL и хостом. Приходилось мне лепить такие классы и по собственному опыту могу сказать - лучше используйте run-time пакеты. Просто, надежно и без усилий - в Borland"е совсем не дураки сидят.


Digitman   (2002-07-16 17:44:00) [2]

Почему нельзя ? Можно передавать. Только не сам объект, а адрес существующего экземпляра класса. Адресное пространство-то у хост-процесса и у DLL - одно и то же, RTTI (пусть даже в нескольких экз-рах при отказе от Build with runtime packges) - одна и та же (если хост-приложение и DLL собраны в одной и той же версии Делфи)


Гас   (2002-07-16 15:41:00) [3]

Сапсибо, буду переваривать полученную информацию :)


Mystic   (2002-07-16 15:37:00) [4]

Проблему может решить установка опции Build with runtime packges (или хотя бы только vcl)

Может еще помогут пара моих соображений по этому вопросу:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1026672057&n=0


Гас   (2002-07-16 15:25:00) [5]

Что-то я слегка запутался уже.. :) Просто хотел сказать, что передавать объект как параметр нельзя, получается.


Digitman   (2002-07-16 15:06:00) [6]

Что есть "получить объект" ?


Гас   (2002-07-16 14:21:00) [7]

Похоже, то что нужно, спасибо! Значит, сам объект никак нельзя получить?..


Eugene Lachinov   (2002-07-16 14:10:00) [8]

Упущен FreeMem

procedure CopyObject(const Source, Dest : TObject);
var
PropList: PPropList;
i, iPropCount : Integer;
begin
iPropCount := GetPropList(Source, PropList);
if iPropCount > 0 then try
for i := 0 to iPropCount - 1 do
with PropList^[i]^ do if not IgnoreProp(Name) then
case PropType^^.Kind of
tkInteger, tkChar, tkWChar, tkEnumeration, tkSet,
tkFloat, tkString, tkLString, tkWString, tkVariant,
tkInt64, tkDynArray : SetPropValue(Dest, Name, GetPropValue(Source, Name));
tkClass : SetObjectProp(Dest, Name, GetObjectProp(Source, Name));
end
finally
FreeMem(PropList)
end
end;


Eugene Lachinov   (2002-07-16 13:46:00) [9]

function IgnoreProp(const PropName : string) : Boolean;
begin
Result := (CompareText(PropName, "Active") = 0) or
(CompareText(PropName, "Connected") = 0) or
(CompareText(PropName, "Name") = 0)
end;

procedure CopyObject(const Source, Dest : TObject);
var
PropList: PPropList;
i, iPropCount : Integer;
begin
iPropCount := GetPropList(Source, PropList);
for i := 0 to iPropCount - 1 do
with PropList^[i]^ do if not IgnoreProp(Name) then
case PropType^^.Kind of
tkInteger, tkChar, tkWChar, tkEnumeration, tkSet,
tkFloat, tkString, tkLString, tkWString, tkVariant,
tkInt64, tkDynArray : SetPropValue(Dest, Name, GetPropValue(Source, Name));
tkClass : SetObjectProp(Dest, Name, GetObjectProp(Source, Name));
end
end;

...

CopyObject(DLLReturnsFont, FFont);


Гас   (2002-07-16 13:40:00) [10]

> В чём твоя цель ??
Научиться :)


Skier   (2002-07-16 13:08:00) [11]

>Гас
Можно писать св-ва TFont в TStream через TWriter (?)
А вообще-то зачем тебе это всё ?
В чём твоя цель ??


Digitman   (2002-07-16 13:08:00) [12]

А почему ты не можешь получить доступа к объекту, одинаково декларированному и в хост-приложении и в DLL, но создаваемому в контексте DLL-вызова ? Мне непонятно, какие здесь могут быть трудности.

Уточни, где и как декларирована переменная DLLReturnsFont, в каком контексте и каким образом она заполняется ссылкой на некий объект класса TFont


Гас   (2002-07-16 13:00:00) [13]

ToSkier : Да, действительно, я не подумал о PChar. Но неужели нет другого решения?..


Гас   (2002-07-16 12:55:00) [14]

И кстати, как тогда получить доступ к (Фонт из DLL).Color, (Фонт из DLL).Style и т.п... Должен ведь быть выход.. В хелпе это описано слишком скудно. :(


Skier   (2002-07-16 12:51:00) [15]

>Гас

> А как передать строку из DLL?

Нужно передавать не строку, а PChar

> По-моему это тоже непросто..


Проще паренной репы...


Гас   (2002-07-16 12:48:00) [16]

Да, Assign я смотрел в исходниках уже, но просто хотел поставить задачу более глобально, то есть как получить доступ к объекту, создаваемому в DLL.. Надо ж ведь научиться делать такое..
А как передать строку из DLL? По-моему это тоже непросто..


Skier   (2002-07-16 12:20:00) [17]

>Гас
Можно так (если не учитывать что св-ва TFont можно записать
в поток) : "собери" свойства TFont в строку, а при получении из DLL разбирай её.


Digitman   (2002-07-16 12:17:00) [18]

а ты что думаешь - метод Assign() делает это каким-то чудесно-волшебным способом ? Точно так же и делает, только во многих случаях - прозрачно для программера да еще и с использованием вспомогательного метода AssignTo()


Гас   (2002-07-16 12:11:00) [19]

ToSkier: Мне нужно получить оттуда свойства фонта, не знаю только каким способом это сделать..

ToDigitman: Не хочется верить, что это единственный выход. :) Получается очень неуниверсально что-ли.. хех.


Digitman   (2002-07-16 12:04:00) [20]

Передача любого объекта по сути сводится к передаче его свойств. Отсюда и пляши : читаешь значение свойства объекта-источника - записываешь это значение в соотв.свойство объекта-приемника.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо