Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с объектами в DLL 
:(
    Опции темы
Vit
Дата 30.9.2002, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Допустим, что у меня есть класс, вся работа с классом сосредоточена сейчас в одном модуле, что-то типа (код схематичен):

Код

Unit U;

interface

Procedure MyProc1; // процедура которая и нужна мне за пределами модуля
Procedure MyProc2; // процедура которая и нужна мне за пределами модуля

implementation

Var MyVar:TMyClass;

Procedure MyProc1;
begin
//something using MyVar;
end;

Procedure MyProc2;
begin
//something using MyVar;
end;

initialization
 MyVar:=TMyClass.create;
finalization
 MyVar.free;
end;



Таким образом для меня из других модулей использование MyVar и TMyClass полностью прозрачно... Я бы хотел выделить этот код в DLL, но есть определённая трудность: в приведенном модуле экцемпляр класса TMyClass создаётся только один раз и уничтожается только один раз при том что процедуры могут вызываться многократно. А как такое сделать в DLL? Дело в том что создание TMyClass процесс довольно сложный и длительный, а вызовов процедур много, если создавать экземпляр класса в каждом вызове, то производительность кода будет очень большая, в то же время если в DLL есть код инициализации в который я смогу впихнуть создание объекта (а будет ли это корректно?), то секции кода завершения нет, и вообще, при двух вызовах процедуры из DLL будет использоваться тот же экземпляр глобальной переменной или каждый раз новый? (и отличается ли это при статической и динамической загрузке?)


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 1.10.2002, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



На самом деле есть входная точка в dll. То есть функция, которая вызывается при кажой загрузки/выгрузке dll. В эту функцию передается значение hInstance и Reason. Reason как раз и указывает загружается dll или выгружается, здесь то и можно инциализировать/деинициализировать что ты хочешь. Запрятана эта функция в SysInit или в Systm. Однако предоставляется переменная DllProc в SysInit. Это есть указатель на процедуру типа:
 procedure (Reason: Integer);

пожалуй, если ты после begin напишишь
DllProc:=MyDllMain; // это твоя процедура инициализации.
то получешь , что надо.

Цитата
при двух вызовах процедуры из DLL будет использоваться тот же экземпляр глобальной переменной или каждый раз новый? (и отличается ли это при статической и динамической загрузке?)


Не очень понятен вопрос. Если процесс один, то и данные Dll для него те же на протяжении всего использования. От типа загрузки это не зависит.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1675 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.