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