Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2006, 17:38   #1
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию передача объектов как параметров функций в Dll

хочу создать Dll с функциями, параметрами которых служили бы не стандартные типы, а объекты и возвращали бы они тоже объекты.

возможно ли такое в Dll и если да то как?

заранее благодарен.
Umen вне форума Ответить с цитированием
Старый 10.11.2006, 17:43   #2
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Какие именно объекты? В параметре любой функции или процедуры можно можно использовать такие классы, как TImage, DBGrids, любые!!!
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 11.11.2006, 11:39   #3
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 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.
Umen вне форума Ответить с цитированием
Старый 11.11.2006, 12:48   #4
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Постой-ка!!! Не забывай, что для начала нужно этот класс обявить как тип:
type
TFileInfo = Class
И т.д....

И его же нужно объявлять в самой программе и переменную в программе нужно объявлять не в самой процедуре, а в заголовке, там же, где и TForm. Если все это есть,то пиши, будем думать дальше...
Плюс ты объявляешь Конструктор, он зачем? Или что он делает, если быть точнее.
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 11.11.2006 в 12:58. Причина: Добавления
SuperVisor вне форума Ответить с цитированием
Старый 11.11.2006, 16:02   #5
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 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;
Umen вне форума Ответить с цитированием
Старый 12.11.2006, 00:13   #6
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

А ты в заголовке самой проги точно ShareMem прописал? И кстати... А деструктор написан? Почти всегда на собственный конструктор должен быть собственный деструктор, тем более ты используешь dll!!!
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 12.11.2006 в 00:16. Причина: Добавления
SuperVisor вне форума Ответить с цитированием
Старый 12.11.2006, 10:58   #7
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

SuperVisor, деструктор это Free ?
Alar вне форума Ответить с цитированием
Старый 12.11.2006, 13:14   #8
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
SuperVisor, деструктор это Free ?
Ну да: на все объекты, очистка зарезервированной памяти, полный дестрой класса.

Просто так как есть пользовательский constructor, должен быть и destructor. Часто компоненты из-за этого глючат.
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 12.11.2006 в 13:17. Причина: Добавления
SuperVisor вне форума Ответить с цитированием
Старый 12.11.2006, 14:02   #9
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

Free - выполняем, если делали Create сами.
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 12.11.2006, 19:31   #10
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

На самом деле Free это не совсем деструктор:
Free сначала проверяет не равен ли объект nil и исли не равен, то вызывает деструктор, поэтому Free предпочтительней чем прямой вызов деструктора.

Если в в классе явно не описан деструктор, то будет использоваться
деструктор родительского класса в данном случае TObject
Umen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров 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