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

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

Запутался с показом немодальной формы из DLL


Страницы:   1 2 3 4

DmiSb ©   (2006-10-23 11:28:00) 

Никак не пойму, почему при закрытии немодальной формы из динамически загруженной DLL вылетает AV

Код DLL :

library MyLIB;

uses
 SysUtils,
 Classes,
 Windows,
 Forms,
 ibase,
 LIBFormU in 'LIBFormU.pas' {LibF};

procedure LibFormShow(HApp, HForm: THandle); stdcall;
begin
 Application.Handle := HApp;
 if Assigned(LibF) then
   LibF.Show
 else begin
   LibF:=TLibF.Create(Application);
   LibF.CallForm:=HForm;
   LibF.Show;
 end;
end;

procedure LibFormFree; stdcall;
begin
 LibF.Free;
end;

exports LibFormShow;
exports LibFormFree;

begin
end.

Кусок кода основной программы:

 TLibFormShow = procedure(HApp, HForm: THandle); stdcall;
 TLibFormFree = procedure; stdcall;

var HLib: THandle;

procedure TMainF.WMUser(var Msg: TMessage);
var LF: TLibFormFree;
begin
 if HLib > HInstance_Error then begin
   LF := GetProcAddress(HLib, 'LibFormFree');
   if Assigned(LF) then LF;
   FreeLibrary(HLib);
 end;
end;

procedure TMainF.SpeedButton1Click(Sender: TObject);
var LS: TLibFormShow;
begin
 if HLib <= HInstance_Error then
   HLib := LoadLibrary('MyLib.dll');
 if HlLib > HInstance_Error then begin
   LS := GetProcAddress(HLib, 'LibFormShow');
   if Assigned(LS) then LS(Application.Handle, Self.Handle);
 end;
end;


MetalFan   (2006-10-23 17:55:00) [41]


> procedure TLibF.FormClose(Sender: TObject; var Action: TCloseAction);
>
> begin
>  if CallForm<>0 then
>    SendMessage(CallForm, wm_User, 0, 0);
> end;


и что мы видим? из метода мы шлем SendMessage'ом сообщение, ждем его обработки, в котором осовобождается форма и длл... а потом соотв AV, ибо память то уже очищена...
замени SendMessage на PostMessage...


DmiSb   (2006-10-23 16:02:00) [42]

Интересно, а как делается вызов какой либо функции из основной программы при нажатии кнопки, расположенной на ДЛЛ-форме ? Это очень сложно ?


medved_68   (2006-10-23 14:01:00) [43]


> При данном способе, форма не разрушается при закрытии, а
> просто прячется, а мне надо чтобы она разрушалась и выгружалась
> Dll

А кто мешает добавить в ДЛЛ функцию разрушения формы которая возвращает True в случае успеха и только после вызова этой  функции выгружать ДЛЛ??? :)))


iva   (2006-10-23 13:53:00) [44]

а как было у тебя?


DmiSb   (2006-10-23 13:49:00) [45]

Ага, вот оно  :-)
Так работает.
Я определил его меньше  WM_USER, хотя.....как это повлияло, непонятно  
Спасибо за помошь


iva   (2006-10-23 13:41:00) [46]

в файле описаний всякой всячины, который используется и в dll и в mainForm

const
 ...
 WM_DLLUNLOAD           = WM_USER+200+108;


DmiSb   (2006-10-23 13:38:00) [47]

Нет, я про константу WM_DLLUNLOAD хотел уточнить


iva   (2006-10-23 13:37:00) [48]

в главной форме

 public
   { Public declarations }
   procedure WMDLLUnload(var Msg:TMessage); message WM_DLLUNLOAD;


DmiSb   (2006-10-23 13:36:00) [49]

При данном способе, форма не разрушается при закрытии, а просто прячется, а мне надо чтобы она разрушалась и выгружалась Dll


DmiSb   (2006-10-23 13:31:00) [50]

Как определил WM_DLLUNLOAD и где ?


iva   (2006-10-23 13:30:00) [51]

у меня нет примера, все в готовом проекте


DmiSb   (2006-10-23 13:29:00) [52]

ДА вроде работает, не вызывается метод FreeLibrary, то есть программа не попадает в процедуру WMDLLUnload(

Скинь свой пример на DmiSb(собака)inbox.ru


iva   (2006-10-23 13:26:00) [53]

пользовался этой статьей, вроде работает.


DmiSb   (2006-10-23 13:19:00) [54]

Я этот пимер видел, но....
Либо опять же неверно определил WM_DLLUNLOAD, но процедура
procedure TMainF.WMDLLUnload(var Message:TMessage); у меня не срабатывает почему-то


iva   (2006-10-23 12:48:00) [55]

тогда посмотри http://www.realcoding.net/article/view/680


DmiSb   (2006-10-23 12:45:00) [56]

Пробовал, до и после еды  :-)


iva   (2006-10-23 12:35:00) [57]

попробуй добавить   Action:=caFree;


DmiSb   (2006-10-23 12:31:00) [58]

Да, прошу прощения, не указал в начале

procedure TLibF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if CallForm<>0 then
   SendMessage(CallForm, wm_User, 0, 0);
end;

Возможно есть другой путь, но ни один попавший мне пример не работает


iva   (2006-10-23 12:25:00) [59]

в dll-овской форме по OnDestroy кидаешь сообщение главной форме и уже оттуда FreeLibrary


MetalFan   (2006-10-23 12:23:00) [60]

и вообще, что-то мне не нравиться использование VCL в dll...


Страницы:   1 2 3 4

Наверх

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