![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с DLL. Метод Assign не хочет выполняться.. :(
Гас © (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]Передача любого объекта по сути сводится к передаче его свойств. Отсюда и пляши : читаешь значение свойства объекта-источника - записываешь это значение в соотв.свойство объекта-приемника.