![]() |
|
Модераторы: MetalFan |
![]()
|
|
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Взял я статью про ком объекты из DRKB. Вот раздел один в ней:
Попробовал я этот код скомпелировать - все пашет, только при закрытии аксес вуалейшн выдает, причем при отладке он выдается уже ПОСЛЕ последнего END. В чем проблема? Пишу в Delphi7 |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
вероятно, но не факт: где-то освобождение памяти идёт несколько раз...
Добавлено @ 14:00 имею виду.. один и тотже объект пытаются освободить несколько раз... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Я вообще удалял вызов Calc.Release; - это ничего не дало....
Даже если просто подключаю объект: СreateObject(ICalcGUID,Calc); , то уже при выходе возникает ошибка... |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
проветь может здесь идет освобождение:
поставь мессажебок если условие выполнено... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
неа оно не выполняется.... условие всмысле...
|
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Есть определенные глюки с FreeLibrary в Delphi. Делфийская dll-ка делает множество всяких действий, нам не видимых. В чем именно проблема пока не знаю, но так как обычно библиотеку освобождаешь при окончании приложения, то можно FreeLibrary не вызывать - виндос освободит ее сама.
В общем, убери FreeLibrary. -------------------- Волны гасят ветер... |
|||
|
||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
О, спс, ща попробую, завтра отпишусь...
|
|||
|
||||
| jack128 |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 18.5.2005 Репутация: 2 Всего: 4 |
вообще то за такие примеры руки мало переломать. Вот, абсолютно коректный пример:
Общий для двух проектов модуль.
DLL:
Exe:
Это сообщение отредактировал(а) jack128 - 30.7.2006, 22:56 |
||||||
|
|||||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Fantasist
Пришлось убрать вообще процедуру Form1.destroy (т.е. все что в ней есть) и тогда заработало) jack128 Так ща будем пробовать |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да, jack128 прав - нужно все ссылки обнулить перед освобождением библиотеки. В данном случае присвоить nil интерфейсной переменной Calc.
jack128, две переменный под интерфейс не нужно, потому что цель примера как раз таки показать, что интерфейс - суть ссылка на таблицу методов, а не что-то там такое особенное. Именно использования одной переменной для двух разных интерфейсов с одинаковыми сингнатурами это наглядно демонстрирует. -------------------- Волны гасят ветер... |
|||
|
||||
| DragonFire |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
У меня все заработало... Я думаю вся проблема была в этом:
А теперь с использованием TInterfacedObject все проблемы решились... Даже без этих строк все пашет:
|
||||
|
|||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
И сразу новый вопрос - как сделать так, чтобы можно было в EXE делать так: Calc.X:=20; ??
Тоесть у меня есть класс:
Как в интерфейт запихнуть property если такое вообще возможно? |
|||
|
||||
| jack128 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 18.5.2005 Репутация: 2 Всего: 4 |
а у меня AV. собственно - у тебя тоже ФМ должно быть. Где именно ты эти строчки закоментировал? Закоментируй в деструкторе и посмотри, что выдет. возможно.
и реализуешь в классе TMyCalc 4 новых метода. Соответственно в EXE вместо FCalc.SetOperands(10, 5) ты можешь написать
Это сообщение отредактировал(а) jack128 - 3.8.2006, 00:47 |
||||
|
|||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Ага понял, типо так вот, да?
Но тогда у меня будут достыпны еще и функции GetFWindow и SetFWindow в EXE, так? а нельзя их спрятать как-нибудь, как в классе все это делается через private |
|||
|
||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Все вопрос отпал, все отлично работает по схеме приведенной мной ваше... Delphi умный
|
|||
|
||||
![]()
|
| Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |