Форум: "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.035 c