![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк в DLL с формой (пример с сайта) ???
Stefan © (2004-04-19 19:43:00)почему в проекте DLL на KOL (c формой) глюк с перемещением формы
и к тому же при повторном вызове процедуры прога вылетает ?
Кто-нибудь сталкивался с этой бодягой ?
Falcon (2004-04-22 09:54:00) [1]Пример работает. Достаточно в продцедуре создания формы в ДЛЛ подменить 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);
Пример взят из статьи с этого сайта.
Stefan (2004-04-22 09:52:00) [2]Вчера проверил - вроде работает без глюков. Сенкс.
z007 (2004-04-21 20:47:00) [3]2 Stefan
1/ А на самом деле создается?
И надо ли ее создавать при запуске библиотеки, если мы вызываем ее по необходимости?
2/ Как пример - работает?
Stefan (2004-04-21 09:19:00) [4]Создается - как было в примере:
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-20 22:39:00) [5]Мне кажется, тут что-то связано с 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 или нет?
Falcon (2004-04-20 19:01:00) [6]У меня такой ошибки нет. У меня другая есть :)
Ошибка действительно вылетает, но не при вызове продцедуры из ДЛЛ, а при разрушении основной формы. RunTimeError.
2nester : в примере используется привязка ДЛЛ к приложению, а человек спрашивает о динамической загрузке.
Stefan (2004-04-20 15:56:00) [7]Да, действительно компилируется, вызывается успешно, но ...
при первом испытании вылетела после второго запуска, во второй
раз вылетела через три запуска, в третий - после семи (дальше -
вразноброд, но не больше 10-ти).
Нарываемся на Error:
Access violation at address 0047196D in module 'KOLDLL.DLL'.
Write of address 00473B24
Причём адрес каждый раз одинаковый (даже после перезагрузки).
В чём проблема на этот раз ?
Win98, теперь уже D7, KOL1.86
Stefan (2004-04-20 15:10:00) [8]из проги вызываю так:
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 как в примере (не изменяю)
nester (2004-04-20 14:07:00) [9]К стати пример с сайта работает замечательно
nester (2004-04-20 13:02:00) [10]покажи как ты форму вызываешь и как ее динамически создаешь из длл
Stefan (2004-04-20 12:22:00) [11]На сайте Кладова есть демка - пример DLL с формой.
Там (в архиве) два проекта - KOLDLL и VCLProject
компилируются нормально - получаем dll и exe
После запуска нажимаем кнопку, форма (из DLL) появляется,
но с ней ничего нельзя сделать - висит намертво.
Пробую вызывать процедуру из DLL из своей программы, всё нормально до её закрытия - при повторном вызове моя прога вылетает. Код смотрел, вроде всё нормально...
nester (2004-04-20 12:19:00) [12]А при вызове какой процедуры?
По идее ты создаешь форму, в том месте где тебе надо в длл, затем работаешь с ней, но если ты ее закрыл - она естественно уничтожается, и поэтому тебе надо создавать ее заново, когда хочешь еще раз ее увидеть
z007 (2004-04-19 21:30:00) [13]Поподробнее?