Главная страница
    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.039 c
1-1098192906
Dr. Genius
2004-10-19 17:35
2004.11.07
Неповрежденные части файлов с диска A:


1-1098592254
PURGEN
2004-10-24 08:30
2004.11.07
вопрос про объекты


3-1097072048
Akoli
2004-10-06 18:14
2004.11.07
Создаю DBF как задать размер поля Integer?


3-1097339186
Cobalt
2004-10-09 20:26
2004.11.07
Различие всяких технологий


3-1097046463
Pashkerton
2004-10-06 11:07
2004.11.07
DateTime в SQL 2000 Server





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