Текущий архив: 2006.12.03;
Скачать: CL | DM;
Вниз
Запутался с показом немодальной формы из DLL Найти похожие ветки
← →
DmiSb (2006-10-23 11:28) [0]Никак не пойму, почему при закрытии немодальной формы из динамически загруженной 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;
← →
Сергей М. © (2006-10-23 11:40) [1]для начала:
procedure LibFormFree; stdcall;
begin
FreeAndNil(LibF);
end;
← →
DmiSb (2006-10-23 11:49) [2]FreeAndNil(LibF) не помогает, при закрытии формы AV
← →
Сергей М. © (2006-10-23 11:52) [3]Закрытие выполняется юзером илии программно ?
На какой строчке возникает AV ?
← →
DmiSb (2006-10-23 11:58) [4]Закрытие окна производится бы пользователем,
а ошибка возникает на сктроке FreeLibrary(HLib);
в procedure TMainF.WMUser(var Msg: TMessage);
← →
MetalFan © (2006-10-23 12:22) [5]а откуда посылается это сообщение?!
← →
MetalFan © (2006-10-23 12:23) [6]и вообще, что-то мне не нравиться использование VCL в dll...
← →
iva © (2006-10-23 12:25) [7]в dll-овской форме по OnDestroy кидаешь сообщение главной форме и уже оттуда FreeLibrary
← →
DmiSb (2006-10-23 12:31) [8]Да, прошу прощения, не указал в начале
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:35) [9]попробуй добавить Action:=caFree;
← →
DmiSb (2006-10-23 12:45) [10]Пробовал, до и после еды :-)
← →
iva © (2006-10-23 12:48) [11]тогда посмотри http://www.realcoding.net/article/view/680
← →
DmiSb (2006-10-23 13:19) [12]Я этот пимер видел, но....
Либо опять же неверно определил WM_DLLUNLOAD, но процедура
procedure TMainF.WMDLLUnload(var Message:TMessage); у меня не срабатывает почему-то
← →
iva © (2006-10-23 13:26) [13]пользовался этой статьей, вроде работает.
← →
DmiSb (2006-10-23 13:29) [14]ДА вроде работает, не вызывается метод FreeLibrary, то есть программа не попадает в процедуру WMDLLUnload(
Скинь свой пример на DmiSb(собака)inbox.ru
← →
iva © (2006-10-23 13:30) [15]у меня нет примера, все в готовом проекте
← →
DmiSb (2006-10-23 13:31) [16]Как определил WM_DLLUNLOAD и где ?
← →
DmiSb (2006-10-23 13:36) [17]При данном способе, форма не разрушается при закрытии, а просто прячется, а мне надо чтобы она разрушалась и выгружалась Dll
← →
iva © (2006-10-23 13:37) [18]в главной форме
public
{ Public declarations }
procedure WMDLLUnload(var Msg:TMessage); message WM_DLLUNLOAD;
← →
DmiSb (2006-10-23 13:38) [19]Нет, я про константу WM_DLLUNLOAD хотел уточнить
← →
iva © (2006-10-23 13:41) [20]в файле описаний всякой всячины, который используется и в dll и в mainForm
const
...
WM_DLLUNLOAD = WM_USER+200+108;
← →
DmiSb (2006-10-23 13:49) [21]Ага, вот оно :-)
Так работает.
Я определил его меньше WM_USER, хотя.....как это повлияло, непонятно
Спасибо за помошь
← →
iva © (2006-10-23 13:53) [22]а как было у тебя?
← →
medved_68 © (2006-10-23 14:01) [23]
> При данном способе, форма не разрушается при закрытии, а
> просто прячется, а мне надо чтобы она разрушалась и выгружалась
> Dll
А кто мешает добавить в ДЛЛ функцию разрушения формы которая возвращает True в случае успеха и только после вызова этой функции выгружать ДЛЛ??? :)))
← →
DmiSb (2006-10-23 16:02) [24]Интересно, а как делается вызов какой либо функции из основной программы при нажатии кнопки, расположенной на ДЛЛ-форме ? Это очень сложно ?
← →
MetalFan © (2006-10-23 17:55) [25]
> procedure TLibF.FormClose(Sender: TObject; var Action: TCloseAction);
>
> begin
> if CallForm<>0 then
> SendMessage(CallForm, wm_User, 0, 0);
> end;
и что мы видим? из метода мы шлем SendMessage"ом сообщение, ждем его обработки, в котором осовобождается форма и длл... а потом соотв AV, ибо память то уже очищена...
замени SendMessage на PostMessage...
← →
MetalFan © (2006-10-23 17:58) [26]кстати, читаем MSDN
0 through WM_USER–1 Messages reserved for use by the system.
WM_USER through 0x7FFF Integer messages for use by private window classes.
WM_APP through 0xBFFF Messages available for use by applications.
0xC000 through 0xFFFF String messages for use by applications.
Greater than 0xFFFF Reserved by the system for future use
надо пользовать WM_APP + SomeInt...
← →
Ketmar © (2006-10-23 18:15) [27]>[26] MetalFan(c) 23-Oct-2006, 17:58
>надо пользовать WM_APP + SomeInt...
не обязательно. это желательно делать, если обмениваются сообщениями приложения. а в нашем случае мы имеем как раз "private window class".
и вообще, для обмена сообщениями между приложениями есть RegisterWindowMessage(). %-)
← →
MetalFan © (2006-10-23 18:20) [28]
> Ketmar © (23.10.06 18:15) [27]
ага, я не прав)
← →
MetalFan © (2006-10-23 18:22) [29]а по поводу
MetalFan © (23.10.06 17:55) [25]
что скажете?
← →
Ketmar © (2006-10-23 18:34) [30]>[29] MetalFan(c) 23-Oct-2006, 18:22
всё верно у тебя там указано. %-)
← →
Leonid Troyanovsky © (2006-10-23 19:18) [31]
> Ketmar © (23.10.06 18:34) [30]
> всё верно у тебя там указано. %-)
+ от меня бонус:
не пользовать формы из длл, тогда и будет всем джа.
--
Regards, LVT.
← →
Ketmar © (2006-10-23 19:25) [32]>[31] Leonid Troyanovsky(c) 23-Oct-2006, 19:18
>+ от меня бонус:
>не пользовать формы из длл, тогда и будет всем джа.
или, всё же, сначала разобраться, как это делать правильно. но лучше не использовать вообще -- ты прав. %-)
← →
MetalFan © (2006-10-23 21:06) [33]а если ср-вами winapi?
← →
Ketmar © (2006-10-23 21:08) [34]>[33] MetalFan(c) 23-Oct-2006, 21:06
>а если ср-вами winapi?
в WinAPI нет форм.
← →
MetalFan © (2006-10-23 21:17) [35]
> Ketmar © (23.10.06 21:08) [34]
но окна то есть)
← →
Ketmar © (2006-10-23 21:29) [36]>[35] MetalFan(c) 23-Oct-2006, 21:17
>но окна то есть)
окна -- есть. а форм -- нет. в [31] и [32] речь шла только о формах. %-)
← →
DmiSb (2006-10-24 07:47) [37]> не пользовать формы из длл, тогда и будет всем джа
А если есть необходимость разбить программу на модули, которые подгружались бы только в случае необходимости (также динамически как ДЛЛ) ?
← →
Loginov Dmitry © (2006-10-24 07:57) [38]DmiSb (24.10.06 7:47) [37]
А если есть необходимость разбить программу на модули, которые подгружались бы только в случае необходимости (также динамически как ДЛЛ
Скомпилируй все с пакетами (одного VCL вполне достаточно) и наслаждайся жизнью.
← →
DmiSb (2006-10-24 08:03) [39]Дык, а хочется еще меньше. У меня итак и основная программа и ДЛЛ компиляться с пакетами.
Это не выход.
Задача разбить программу на модули
← →
Ketmar © (2006-10-24 08:14) [40]>[39] DmiSb 24-Oct-2006, 08:03
>программа и ДЛЛ компиляться с пакетами.
>Это не выход.
отчего?
>Задача разбить программу на модули
и всенепременно динамически подгружаемые? может, тогда проще Оберон взять? %-)
Страницы: 1 2 вся ветка
Текущий архив: 2006.12.03;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.035 c