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

Вниз

Глюк в 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 вся ветка

Форум: "KOL";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.031 c
14-1098272595
Vol
2004-10-20 15:43
2004.11.07
Вернуть к жизни винчестер и информацию на нем


3-1097218453
Dush
2004-10-08 10:54
2004.11.07
Активные подключения к базе


1-1098828526
BURN
2004-10-27 02:08
2004.11.07
Память


9-1089007632
dRake
2004-07-05 10:07
2004.11.07
TankMaze - первая демка!


3-1097124162
Litr
2004-10-07 08:42
2004.11.07
DBLookUpComboBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский