![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка после нескольких вызывов MCK формы из DLL [Delphi, Windows]
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