![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Форумчанин
Регистрация: 10.11.2006
Сообщений: 189
|
![]()
хочу создать Dll с функциями, параметрами которых служили бы не стандартные типы, а объекты и возвращали бы они тоже объекты.
возможно ли такое в Dll и если да то как? заранее благодарен. |
![]() |
![]() |
![]() |
#2 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
![]()
Какие именно объекты? В параметре любой функции или процедуры можно можно использовать такие классы, как TImage, DBGrids, любые!!!
Познавая других, мы познаем себя.
С'est la vie... |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 10.11.2006
Сообщений: 189
|
![]()
Я написал DLL в которой есть несколько функций, например
function StrSize(Item: TFileInfo): String; где TFileInfo = Class private FSearchRec: TSearchRec; function GetName: TFileName; function GetDosName: TFileName; function GetSize: Integer; function GetCreateTime: TDateTime; function GetAccessTime: TDateTime; function GetModifyTime: TDateTime; function GetAttr: TAttributes; function GetExcludeAttr: Integer; public property Name: TFileName read GetName; property DosName: TFileName read GetDosName; property Size: Integer read GetSize; property CreateTime: TDateTime read GetCreateTime; property AccessTime: TDateTime read GetAccessTime; property ModifyTime: TDateTime read GetModifyTime; property Attr: TAttributes read GetAttr; property ExcludeAttr: Integer read GetExcludeAttr; Constructor Create(SearchRec: TSearchRec); end; при выполнении данной функции (и любой другой с классом в качесвте параметра) из основной программы вылетает сообщение Invalid pointer operation но если использовать не DLL, а обычный Unit, то всё работает отлично. Кстати поскольку функция возвращает результат типа string, то, как требует Borland, библиотека borlndmm.dll также подключена. Не смог понять в чем причина. Пробовал определять Item как Pointer, а потом, внутри функции приводить к типу TFileInfo, всё равно не помогает Последний раз редактировалось Umen; 11.11.2006 в 11:45. |
![]() |
![]() |
![]() |
#4 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
![]()
Постой-ка!!! Не забывай, что для начала нужно этот класс обявить как тип:
type TFileInfo = Class И т.д.... И его же нужно объявлять в самой программе и переменную в программе нужно объявлять не в самой процедуре, а в заголовке, там же, где и TForm. Если все это есть,то пиши, будем думать дальше... Плюс ты объявляешь Конструктор, он зачем? Или что он делает, если быть точнее.
Познавая других, мы познаем себя.
С'est la vie... Последний раз редактировалось SuperVisor; 11.11.2006 в 12:58. Причина: Добавления |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 10.11.2006
Сообщений: 189
|
![]()
Описываю подробнее:
есть модуль DirTypes.pas в нём описан класс TFileInfo: type TFileInfo = Class и т.д. TFileInfo всего лишь представляет информацию полученную с помощью FindFirst в структуре TSearchRec в более удобоваримом для дальнейшего использования формате. Вот тело конструктора: Constructor TFileInfo.Create(SearchRec: TSearchRec); begin FSearchRec := SearchRec; end; этот модуль прописан в uses DLL и в главной форме. в главной форме вызываю функцию procedure TMainForm.Button1Click(Sender: TObject); var DirInfo: TDirInfo; // список элементов типа TFileInfo i, k: integer; Att: integer; Fi: TFileInfo; begin DirInfo := TDirInfo.Create; Memo1.Clear; Memo2.clear; Memo3.Clear; Memo4.Clear; Memo5.clear; Memo6.Clear; Att := (BoolToInt(CheckBox1.Checked) and faReadOnly) or (BoolToInt(CheckBox2.Checked) and faHidden) or (BoolToInt(CheckBox3.Checked) and faSysFile) or (BoolToInt(CheckBox4.Checked) and faVolumeID) or (BoolToInt(CheckBox5.Checked) and faDirectory) or (BoolToInt(CheckBox6.Checked) and faArchive) or (BoolToInt(CheckBox7.Checked) and faSymLink); //функция из DLL, //заполняет список DirInfo элементами типа TFileInfo GetDirInfo(Edit1.Text, Att, DirInfo); //выделенные функции вызываются из DLL //весь цикл программы выполняется полностью и правильно!!! //но после выполнения цикла выскакивает ошибка // "invalid pointer operation" // тот же самый кусок программы при перемещении // выделенных функций в обычный модуль // выполняется без возникновения ошибок k := DirInfo.Count - 1; For i:=0 to k do begin Fi := TFileInfo(DirInfo.Objects[i]); Memo1.Lines.Add(DirInfo.Strings[i]); Memo2.Lines.Add(StrSize(Fi)); Memo3.Lines.Add(StrCreateTime(Fi)); Memo4.Lines.Add(StrAccessTime(Fi)); Memo5.Lines.Add(StrModifyTime(Fi)); Memo6.Lines.Add(StrAttr(Fi)); end; end; |
![]() |
![]() |
![]() |
#6 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
![]()
А ты в заголовке самой проги точно ShareMem прописал? И кстати... А деструктор написан? Почти всегда на собственный конструктор должен быть собственный деструктор, тем более ты используешь dll!!!
Познавая других, мы познаем себя.
С'est la vie... Последний раз редактировалось SuperVisor; 12.11.2006 в 00:16. Причина: Добавления |
![]() |
![]() |
![]() |
#7 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,649
|
![]()
SuperVisor, деструктор это Free ?
|
![]() |
![]() |
![]() |
#8 |
Павел Сергеевич
Форумчанин
Регистрация: 05.11.2006
Сообщений: 665
|
![]()
Ну да: на все объекты, очистка зарезервированной памяти, полный дестрой класса.
Просто так как есть пользовательский constructor, должен быть и destructor. Часто компоненты из-за этого глючат.
Познавая других, мы познаем себя.
С'est la vie... Последний раз редактировалось SuperVisor; 12.11.2006 в 13:17. Причина: Добавления |
![]() |
![]() |
![]() |
#9 |
Владимир М.
Участник клуба
Регистрация: 30.10.2006
Сообщений: 1,289
|
![]()
Free - выполняем, если делали Create сами.
Берегите друг друга!
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 10.11.2006
Сообщений: 189
|
![]()
На самом деле Free это не совсем деструктор:
Free сначала проверяет не равен ли объект nil и исли не равен, то вызывает деструктор, поэтому Free предпочтительней чем прямой вызов деструктора. Если в в классе явно не описан деструктор, то будет использоваться деструктор родительского класса в данном случае TObject |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача параметров | aesoem | Общие вопросы Delphi | 8 | 15.07.2008 21:51 |
CDialog передача параметров! | mahsus | Общие вопросы .NET | 4 | 09.03.2008 17:40 |
Сохранение параметров программы... | Roof | Общие вопросы Delphi | 10 | 11.10.2007 08:22 |
Передача параметров программе при её запуске | troo | Общие вопросы Delphi | 7 | 13.05.2007 21:22 |
Передача параметров | Gudzon | Общие вопросы Delphi | 12 | 08.02.2007 08:19 |