Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Глюк в DLL с формой (пример с сайта) ???   Найти похожие ветки 

 
Stefan   (2004-04-19 19:43) [0]

почему в проекте DLL на KOL (c формой) глюк с перемещением формы
и к тому же при повторном вызове процедуры прога вылетает ?

Кто-нибудь сталкивался с этой бодягой ?


 
z007   (2004-04-19 21:30) [1]

Поподробнее?


 
nester ©   (2004-04-20 12:19) [2]

А при вызове какой процедуры?
По идее ты создаешь форму, в том месте где тебе надо в длл, затем работаешь с ней, но если ты ее закрыл - она естественно уничтожается, и поэтому тебе надо создавать ее заново, когда хочешь еще раз ее увидеть


 
Stefan   (2004-04-20 12:22) [3]

На сайте Кладова есть демка - пример DLL с формой.
Там (в архиве) два проекта - KOLDLL и VCLProject
компилируются нормально - получаем dll и exe
После запуска нажимаем кнопку, форма (из DLL) появляется,
но с ней ничего нельзя сделать - висит намертво.

Пробую вызывать процедуру из DLL из своей программы, всё нормально до её закрытия - при повторном вызове моя прога вылетает. Код смотрел, вроде всё нормально...


 
nester ©   (2004-04-20 13:02) [4]

покажи как ты форму вызываешь и как ее динамически создаешь из длл


 
nester ©   (2004-04-20 14:07) [5]

К стати пример с сайта работает замечательно


 
Stefan   (2004-04-20 15:10) [6]

из проги вызываю так:

var
   DllHandle  : THandle;
   DllProc    : procedure;
 begin
   DllHandle := LoadLibrary("MyDll.dll");
   if DllHandle <> 0 then begin
                            @DllProc := GetProcAddress(DllHandle,"CallKOLFormModal");
                            DllProc;
                          end;
   FreeLibrary(DllHandle);
 end;

dll как в примере (не изменяю)


 
Stefan   (2004-04-20 15:56) [7]

Да, действительно компилируется, вызывается успешно, но ...
при первом испытании вылетела после второго запуска, во второй
раз вылетела через три запуска, в третий - после семи (дальше -
вразноброд, но не больше 10-ти).

Нарываемся на Error:

Access violation at address 0047196D in module "KOLDLL.DLL".
Write of address 00473B24

Причём адрес каждый раз одинаковый (даже после перезагрузки).

В чём проблема на этот раз ?

Win98, теперь уже D7, KOL1.86


 
Falcon ©   (2004-04-20 19:01) [8]

У меня такой ошибки нет. У меня другая есть :)

Ошибка действительно вылетает, но не при вызове продцедуры из ДЛЛ, а при разрушении основной формы. RunTimeError.

2nester : в примере используется привязка ДЛЛ к приложению, а человек спрашивает о динамической загрузке.


 
z007   (2004-04-20 22:39) [9]

Мне кажется, тут что-то связано с Applet - это голобальная (?) переменная и я не точно знаю, vожет она как-то доступна в dll из программы, подменяется и теряется?

Короче, вот этот код должен работать без ошибок (проверил раз 20):

procedure CallKOLFormModal;
var {KOLForm1: PKOLForm1;} (*это уже объявлено в interface юнита*)
   hApplet: PControl;
begin
 hApplet := NewApplet( "fake applet" );
 {Applet := NewApplet( "fake applet" ); }
 (*Applet -. А если мы работаем с конкретным pControl,
   который никто со стороны не достанет.*)
 {Applet.Hide;} (*???*)
 {NewKOLForm1( KOLForm1, Applet );}
 NewKOLForm1( KOLForm1, hApplet );
 KOLForm1.Form.ShowModalEx; (*Или ShowModal*)
{KOLForm1.Form.Free;
 KOLForm1 := nil;
 Free_And_Nil( Applet );
 AppletTerminated := false;}
 (*Не уверен, что это надо.
   Особенно, если мы библиотеку
   после закрытия формы все равно
   освобождаем.
   Вместо этого оставим просто...*)
   hApplet.Free;
end;


PS
Посмотреть begin ... end в dpr-файле библиотеки? Там создается KOLForm1 или нет?


 
Stefan   (2004-04-21 09:19) [10]

Создается - как было в примере:

begin // PROGRAM START HERE -- Please do not remove this comment

{$IFDEF KOL_MCK} {$I KOLDLL_0.inc} {$ELSE}

 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;

{$ENDIF}

end.


 
z007   (2004-04-21 20:47) [11]

2 Stefan
1/ А на самом деле создается?
И надо ли ее создавать при запуске библиотеки, если мы вызываем ее по необходимости?
2/ Как пример - работает?


 
Stefan   (2004-04-22 09:52) [12]

Вчера проверил - вроде работает без глюков. Сенкс.


 
Falcon ©   (2004-04-22 09:54) [13]

Пример работает. Достаточно в продцедуре создания формы в ДЛЛ подменить Applet на hApplet. Скорее всего Вы правы.
Что касается динамической загрузки, то при загрузке ДЛЛ и вызове продцедур из нее, полезно проводить проверки например так:

{"Чистим" адрес функции от "грязи"}
 @CallKOLFormModal := nil;
 {Пытаемся загрузить библиотеку}
 LibHandle := LoadLibrary("MYDLL.DLL");
 {Если все OK}
 if LibHandle >= 32 then begin
   {...то пытаемся получить адрес функции в библиотеке}
   @CallKOLFormModal :=
   GetProcAddress(LibHandle,"GetSimpleText");
   {Если и здесь все OK}
   if @CallKOLFormModal <> nil then СallKOLFormModal;
     {...то вызываем эту функцию и показываем результат}
 end;
 {И не забываем освободить память и выгрузить DLL}
 FreeLibrary(LibHandle);

Пример взят из статьи с этого сайта.



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
4-1096024986
MooSE
2004-09-24 15:23
2004.11.07
Как вызвать диалог завершения работы Windows?


3-1097244849
serg128
2004-10-08 18:14
2004.11.07
Как определить тонкому клиенту наличие связи с сервером приложени


3-1097148449
Hmm
2004-10-07 15:27
2004.11.07
Проблемма с запуском скрипта создания базы из моего приложения.


10-1056462721
HermitAlex
2003-06-24 17:52
2004.11.07
Динамическое наполнений DataSet в трехзвенном приложении


3-1097230190
Samick
2004-10-08 14:09
2004.11.07
получается чтото вроде поиска