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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2012, 16:40   #1
LISTAT
Пользователь
 
Регистрация: 27.10.2011
Сообщений: 50
Вопрос Вызов деструктора класса при присвоении реализумому методу итерфейса "nil" при освобождении памяти DLL.

Всем доброго времени суток! Вообщем случилась такая проблема:
пишу программу с поддержкой плагинов. "Общение" между программой и dll осуществляется посредством интерфейсов. Т.е. dll и exe имеют общий файл с описанием интерфейсов. В экспортируемую процедуру из dll передаются ссылки на интерфейсы реализованные в приложении, и возвращаются ссылки реализованные в dll, в общем аналог CallBack процедур. Все хорошо если бы не одно "но". Как только я делаю FreeLibrary
загруженной библиотеки, у меня не стого не с сего вызывается деструктор класса в котором реализован интерфейс переданный в dll. Я так понимаю, что когда память занимаемая библиотекой освобождается, автоматически переданному интерфейсу приложения присваивается nil, что и приводит к вызову деструктора. Как это можно побороть?
Заранее спасибо!
К примеру. Интерфейс
Код:
ICallBackLog = interface
     ['{8ADD9B5B-FFC7-4C6A-8AEB-3AA6AECE4C53}']
          procedure CallBackLog(Mes:PChar);
Экспортируемая процедура из DLL

Код:
procedure InitPlugin(Apl:integer;Form:TForm;CallBackLog:ICallBackLog;var APIExecute:IExecutePlugin); stdcall;
begin
CallBackLog.CallBackLog(Pchar('Кокаой-то текст'));{ссылка на этот метод интерфейса
 передается из приложения в данную dll.
После того, как память, занимаемая dll освободиться, то соответственно
CallBackLog:=0 здесь видимо и вызывается деструктор класса, который реализует 
переданный метод интерфейса}
end;
LISTAT вне форума Ответить с цитированием
Старый 08.05.2012, 11:05   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Создавайте интерфейсные классы на основе TComponent, а не TInterfacedObject. Последний имеет автоматическую проверку числа ссылок. Когда в приложении создан интерфейс и передан в dll, то в процедуре приложения где он был создан, эта ссылка уничтожается, потому что локальная. Но 2я копия уже в dll. И когда высвобождается dll, то уничтожается и последняя ссылка на интерфейс, и вызывается деструктор. TComponent хорош тем, что его уничтожение нужно вызывать форсированно. Вроде так. Если не прав, форумчане, поправьте меня, буду благодарен.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
При запуске ругается:"не хватает памяти..." kim_klim Свободное общение 3 19.01.2011 15:39
ошибка при обработке функции класса "missing type specifier - int assumed" askerpro Общие вопросы C/C++ 8 02.06.2010 23:09
Проблема при компиляции в Dev-C++: "инструкция ... обратилась к памяти ... Память не может быть read." Catharsis Общие вопросы C/C++ 3 14.05.2010 02:12
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04