Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TIBataBase и DLL [D7, WinXP]


Страницы:   1 2 3

Maxick ©   (2008-03-13 08:55:00) 

Проблема следующего характера: Передовая в ДЛЛ данный объект и поимел проблему: при завершении приложения в главной форме не могу фрикнуть (DB.Free) объект DB=TIBDataBase. Вызывается исключение: Ошибка опирации с указателем. Соответственно, если мне не всвобождать DB (я ее создаю сам), то исключение: "приложение ххх.exe обратилось к адрессу хххх" и т.д.
Собственно вопрос: с чем это связано и как с тим бороться? Варианты типа "обработай сам это исключение" не хотелось бы слюшать.


Сергей М.   (2008-03-17 12:37:00) [1]


> Сделано для указания родителя, вовсе не бездумно. Мне нужно,
>  чтоб наследовала форма некоторые свойства от Application.


Ни "родительские" ни "наследственные" отношения не имеют к параметру Owner никакого отношения.

Owner - это владелец, а не "родитель" и тем более не "предок".


> Теорию я знаю, и бездумно не сдираю чужие коды - этож класика


Да-да, оно заметно.


> попробуй без соглашения CtdCall вызвать функцию из DLL написаной
> на Delphi в С++


Ну и какой нафих Application в C++ ? И c какой луны там взялся TIBDatabase, который ты вознамерился передать в свою dll ?


Maxick   (2008-03-17 10:48:00) [2]


> Leonid Troyanovsky ©   (17.03.08 10:13) [45]

а попробуй без соглашения CtdCall вызвать функцию из DLL написаной на Delphi в С++...


Leonid Troyanovsky   (2008-03-17 10:13:00) [3]


> Maxick ©   (17.03.08 10:08) [44]

> А по поводу StdCall - это для того, чтоб работали мой длл
> не только с моим приложением. Теорию я знаю, и бездумно

Сказка про белого бычка.

--
Regards, LVT.


Maxick   (2008-03-17 10:08:00) [4]


> Form1:= TForm1.Create(Application);

Сделано для указания родителя, вовсе не бездумно. Мне нужно, чтоб наследовала форма некоторые свойства от Application.
А по поводу StdCall - это для того, чтоб работали мой длл не только с моим приложением. Теорию я знаю, и бездумно не сдираю чужие коды - этож класика ...


Сергей М.   (2008-03-17 09:30:00) [5]

stdcall тоже от балды указано ?
Это, конечно, не принципиально, но нельзя же бездумносдувать чужой код, "заточенный" под чиную специфику)


Сергей М.   (2008-03-17 09:26:00) [6]


> Form1:= TForm1.Create( Application);


Applicationздесь от балды написано ?
Или ты понимаешь смысл именно такого указания ?


Maxick   (2008-03-17 09:02:00) [7]

По логике вещей - да. Но не вижу где.

function InitDll():boolean; stdcall;
begin
Form1:= TForm1.Create(Application);
Result:= true;
end;

function DoneDll():boolean; stdcall;
begin
Form1.Free;
Result:= true;
end;

Function ShowForm(): boolean; stdcall;
begin
form1.show;
Result:= true;
end;


Вызыв:
var//глабальные переменные
hdll: THandle;
..OnCreate(sender);

begin
...
hdll:=LoadLibrary('zzz.dll');
@InitDll:= getprocadress(hdll,'InitDll');
ItitDll;
...
OnDestroy
DaneDll;
FreeLibrary(hdll);
...
OnClick (кнопочка на главной форме)
ShowForm;


Тоесть все по класической схеме.


Сергей М.   (2008-03-17 08:26:00) [8]


> а в DoneDll: Form1.Free


> Убрав DoneDll все стало работать


Те же фаберже, только вид сбоку - где-то присутствует попытка повторного уничтожения объекта, только в д.сл. этим объектом является объект-форма.


Maxick   (2008-03-17 05:59:00) [9]

Нашел я свою ошибку. Дело было вовсе не в DB.Free. У меня в некоторых DLL были не модальные вызовы форм, так вот для этого у меня были initdll и donedll. В InitDll было Form1:= TForm1.Create(Application), а в DoneDll: Form1.Free. Вот  DoneDll и вызывало ошибку: "..обратилась по адресу 0000...". Убрав DoneDll все стало работать.


Сергей М.   (2008-03-14 16:15:00) [10]


> передача компоненты параметром в DLL - это уже фактически
> означает необходимость использования "межмодульного" менеджера
> памяти


Вовсе не обязательно.
Все зависит от конкретной ситуации.
Но если общий менеджер таки необходим, то BwRTP как раз и организует его (и много чего еще кроме оного)


DrPass   (2008-03-14 16:11:00) [11]


> За каким лешим ему ШароМем, если он последовал (якобы) рекомендации
> в [4] ?

Ну здрасьте. Он же передает TIBDatabase, не так ли? Не знаю, что там за рекомендации в [4], перечитывать весь тот тред неохота, но передача компоненты параметром в DLL - это уже фактически означает необходимость использования "межмодульного" менеджера памяти.


Сергей М.   (2008-03-14 15:39:00) [12]


> DrPass ©   (14.03.08 15:37) [35]


За каким лешим ему ШароМем, если он последовал (якобы) рекомендации в [4] ?


DrPass   (2008-03-14 15:37:00) [13]


> У меня появилась мысль, что я сделал не так... через пару
> часов проверю, а то может зря почем раздую проблему..

У меня тоже. Ты ж передаешь компоненту в библиотеку. uses ShareMem в dpr-файлах приложения и библиотеки написать не забыл?


Maxick   (2008-03-14 13:04:00) [14]


> Сергей М. ©

У меня появилась мысль, что я сделал не так... через пару часов проверю, а то может зря почем раздую проблему..


Сергей М.   (2008-03-14 13:04:00) [15]


> два раза пытаюсь выполнить Free


А так оно и есть на самом деле)

И dll тут вообще ни причем - теми же гряблями ты получишь по тому же лбу, где бы ни находилась ф-ция xxx.


> но я вас огарчу, в тексте идет: if DB<>nil


Я не вижу подобной проверки в твоем тексте.

А даже если бы она и была, то для успешной работы возложенной на эту проверку логики ты обязанобNILить указатель при первом же уничтожении объекта, на который этот указатель ссылается.

Да и нафих, спрашивается, уничтожать в dll этот объект, если dll не вправе распоряжаться его жизнью, хотя бы по причине того, что объект этот был передан в dll из создавшего его exe во временноепользование ?

А если так хочится приложить в dll свои шаловливые ручки к уничтожению объекта, то и создавать его изволь в той же dll !


Maxick   (2008-03-14 12:54:00) [16]

> Сергей М. ©   (14.03.08 12:48) [31]

Я понимаю, что речь идет о

> db.free; //Здесь программа обращается по адрессу 0000...
>
> freeLibrary(hdll);
> Applikation.Terminate;
> exit;
> end; //if else
> freelibrary(hdll);
> end;
> ...
> procedure ...OnDestroy(Sender...);
> ...
> db.Free;


?
Ведь в тексте не просто так я дописал:
> db.free; //Здесь программа обращается по адрессу 0000...
и это еще долеко до OnDestroy.
Когда я писал тот фрагмент сразу подумал, что так и поймете о том, что два раза пытаюсь выполнить Free, но я вас огарчу, в тексте идет: if DB<>nil then DB.Free
Может и не совсем коректно, но до тута программа всеравно не добирается...


Сергей М.   (2008-03-14 12:48:00) [17]


> Maxick ©   (14.03.08 12:40) [29]


> если выполнить DataBase.Free то


.. то нефих делать это повторно, как это делаешь тыв своем ехе (смотри свои страдания с "фриканьем")

Убийство единожды убиенного карается AV-исключением, что ты и имел "удовольствие" прочувтсвовать)


Maxick   (2008-03-14 12:41:00) [18]


> Но я не думаю что в этом проблема

точнее НЕ в этом :)


Maxick   (2008-03-14 12:40:00) [19]

вот здесь не соглашусь, если выполнить DataBase.Free то придется "колупаться", а если DataBase:= Nil то (покрайней мере проверял до выполнения рекомендаций [4]) в exe компонент DB остается нетронутым (не высвобожденым, с conection = true;).
Ну это ладно, уберу эти строки. Но я не думаю что в этом проблема,т.к. я использую подобным образом далеко не одну DLL, и эти строки только в одной, а не работают все (которые с формами и используют TIBDataBase) функции из DLLок.


Сергей М.   (2008-03-14 12:32:00) [20]


> и с этими строками и без них вчера пробовал - разницы нуль


Ну тогда продолжай "колупаться", если "разницы нуль")


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо