Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка после нескольких вызывов MCK формы из DLL [Delphi, Windows]


Страницы:   1 2

Delphuk ©   (2007-07-02 13:32:00) 

Добрый день. Возникла проблема, при использовании KOL+MCK в dll. Я пишу плагин для программы, и решил использовать KOL+MCK для создания интерфейса. У меня имеется только одна форма (для настроек плагина), вызываю я её следующим образом:
[code]
procedure OnPreferences;
begin
if SettingsForm = nil
then
  begin
   Applet := NewApplet('AMG');
   NewSettingsForm(SettingsForm, Applet);
   SettingsForm.Form.ShowModal;
   SettingsForm.Form.Free;
   SettingsForm := nil;
   Applet.Free;
  end;
end;
[/code]

После нескольких вызывов данной формы, вылетает ошибка. Ещё я заметил, что при вызове методов Free память не освобождается и объект не уничтожается. Сначала я использовал вот такой вариант:

[code]
procedure OnPreferences;
begin
if not Assigned(SettingsForm)
then
  begin
   Applet := NewApplet('AMG');
   NewSettingsForm(SettingsForm, Applet);
   SettingsForm.Form.ShowModal;
   SettingsForm.Form.Free;
   SettingsForm.Free;
   Applet.Free;
  end;
end;
[/code]

Но после закрытия формы память не освобождается. К тому же повторно окно настроек уже не открывается.
Пожалуйста подскажите, как нужно правильно написать этот фрагмент кода.


Delphuk   (2007-07-02 16:06:00) [21]

Всех благодарю за ответы. Прежде чем вообще писать плагин, я конечно же ознакомился с FAQ по работе KOL+MCK в DLL. Да и работать с библиотеками конечно же я умею :)
vpbar писал:
<quote>см
http://kolmck.net/demos/DemoVCL2KOLDLL.zipи http://kolmck.net/demos/Demo2NonModalFormsDLL.zip</quote>

Эти демки я конечно же уже смотрел и писал по аналогии, сейчас даже чуть чуть переделал код:

procedure OnPreferences;
var
SettingsForm: PSettingsForm;
begin
if not Assigned(SettingsForm)
then
  begin
   Applet := NewApplet('AMG');
   Applet.Hide;
   NewSettingsForm(SettingsForm, Applet);
   SettingsForm.Form.ShowModalEx;
   SettingsForm.Form.Free;
   SettingsForm := nil;
   Free_And_Nil(Applet);
   AppletTerminated := false;
 end;
end;


Но это не решает проблем. По прежднемупамять освобождается не полностью и после каждого вызова и закрытия модальной формы, в памяти прибавляется по 4кг, после 7-го вызавов формы, появляется ошибка! После чего форма вообще больше не вызывается.

vpbar, ради спортивного интереса, я скачал думку http://kolmck.net/demos/DemoVCL2KOLDLL.zipскомпилил и проверил как она будет работать. И что вы думаете? :) В этой демке точно такая же проблема, только память вообще не освобождается (в моём плагине всё же освобождает 20 кг, но всё равно есть утечка) и после 5-го или 6-го вызова формы, вылетает ошибка, после чего форма конечно же уже не показывается. Так что похоже есть какие то ошибки в KOL или я, =BuckLr=, создатель демок и тд что то неправильно делаем :(

=BuckLr=, ты написал тоже самое, но всё равно спасибо за отзывчивость и понимание.


vpbar   (2007-07-02 15:36:00) [22]

Вопрос был не в том как динамически подгрузить dll. Я думаю товарисч это умеет. А в остальном вызовы функций из динамически подгруженной и статически(кстати это не совсем верно длл все равно подгружается динамически но уже загрузчиком) происходят одинково и с одинаковыми последствиями.


=BuckLr=   (2007-07-02 15:02:00) [23]

Delphuk, совершенно верно насчёт освобождений и глюков. Я имел некоторый опыт с вызовом формы из длл. Я использовал такой вызов:


 Applet := NewApplet('');
 Applet.Hide;
 NewMainForm(MainForm, Applet);
 MainForm.Form.ShowModalEx;
 MainForm.Form.Free;
 MainForm := nil;
 Free_And_Nil(Applet);


Это приводило к тому, что на FreeLibrary в хост-программе вылазило AV. Когда я стал освобождать библиотеку не сразу после использования, а на OnDestroy программы, ошибок доступа не появлялось. Но это ещё ничего. Самая большая бага происходила тогда, когда я вызывал форму не модально, а встраивал её в окно программы (в хост приложении была предусмотрена такая возможность, и так делалось на всл). Если на форме в длл находился какой-нибудь эдит-контрол, то не работали клавиши влево-вправо, хоть убей. Я так и не разобрался, в чём там дело. Решил проблему (ржать будете, но делать нечего) выносом формы в отдельный поток. Это сработало. А про неосвобождённую память я вообще молчу. Короче, так я и не разобрался, ибо я не программист, а лишь любитель. И для меня эта тема уже не так актуальна. Хотя может быть кто-то из просветлённых покопается и найдёт багу...


> см
> http://kolmck.net/demos/DemoVCL2KOLDLL.zipи http://kolmck.
> net/demos/Demo2NonModalFormsDLL.zip


Это всё хорошо, но, насколько я понимаю, товарищу нужно использовать динамическую загрузку, а в этих примерах статическая. Ведь делается плагин, а не что-то иное...


vpbar   (2007-07-02 14:22:00) [24]

см
http://kolmck.net/demos/DemoVCL2KOLDLL.zipи http://kolmck.net/demos/Demo2NonModalFormsDLL.zip


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо