Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

Запутался с показом немодальной формы из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.043 c
8-1145099031
Серджинйо
2006-04-15 15:03
2006.12.03
Попиксельно нарисовать эллипс


2-1163497639
new1
2006-11-14 12:47
2006.12.03
проблема в создании dbf-файла


2-1163664385
неумейка
2006-11-16 11:06
2006.12.03
Фон StringGrig с перетеканием цвета


2-1163146941
Access
2006-11-10 11:22
2006.12.03
События (свойства) ListView


2-1163749753
StriderMan
2006-11-17 10:49
2006.12.03
Зачем придумали DataSource?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский