![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
AlexLogos |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Привет народ. Хочу разобраться с DLL. Уже который раз начинаю да все никак не закончу.
Есть у меня df.dll со следующим кодом
В программне я описываю ее
Вызываю по нажатию кнопки
Появляеться окошко вызванной формы, но "надено 4776177 записей", по закрытии этой формы - AV и плюс ко всему когда закрываю основную прогу - форма исчезает, но процесс остается в памяти. Где я ошибся? |
||||||
|
|||||||
aleksh |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 609 Регистрация: 8.7.2008 Репутация: 1 Всего: 13 |
а что будет если этот код использовать не в длл а в основном проекте? работает нормально?
покажи реализацию TSameRecord |
|||
|
||||
AlexLogos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Кода много, кое-где он однообразен, поэтому укорочу
Может дело в том что TSameRecord ссылается на другие юниты? |
|||
|
||||
aleksh |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 609 Регистрация: 8.7.2008 Репутация: 1 Всего: 13 |
странно, может форма, которая вызывает процедуру в длл перед этим уничтожается...
а почему freeandnil сразу после появления формы, может прописать его в деструкторе? и еще - попробуй описать эту процедуру там же, откуда вызываешь и проверь как работает |
|||
|
||||
AlexLogos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Процедура которая описана в ДЛЛ взята из юнита форми, там она работает нормально. Я хотел несколько уменьшить код юнита и решил перенести несколько процедур в ДЛЛ. Начал из самой простой.
Форма которая вызывает не уничтожается. Я будрал FreeAndNil(Same); из ДЛЛ, и изменил тип передаваемых параметров так как ДЛЛ плохо работает со String.
Теперь количество "Найдено ... записей" отображается праивльно, но по надатию на кнопки формы - получаю AV, да и после закрытия всех форм и программы - процес и дальше торчит в памяти... Какие особенности работы с ДЛЛ не учел я в работе? |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 2 Всего: 15 |
Если нет жёстких требований по использованию именно DLL в качестве контейнера кода, то лучше использовать BPL Об этом неоднократно писалось на этом форуме. Если же всё таки неюбходимо использование именно DLL то надо правильно (в DLL должны использоваться гл. объекты основного приложения) связывать объекты приложения с глобальными объектами VCL (Application, Session и т. д.), потому как в dll дублируется код VCL, уже существующий висполняемом модуле приложения (ехе). Ты понимаешь какой owner будет у твоего объекта при выполнении следующего кода???
Если вызов TSameRecord находится в dll то соответсвенно Application - ,будет тот который находится в DLL. Bpl лишены этого недостатка. Поэтому если используешь DLL то соответсвенно надо в функцию DLL передовать Application из основного приложения, либо использовать GetModuleHandle + GetProcAddress либо GetModuleHandle + FindHinstance (FindClassHinstance). Если используешь строки, дин. массивы, НЕ ЗАБУДЬ подключить SHAREMEM первым в файлы проектов основного приложения и DLL И ещё один важный момент: операторы is, as опять же будут работать не коррекно по вышеописанной причине(дубль кода) Т.е. если передаёшь объектную ссылку из основного приложения а выполняешь сравнение по типу объекта в dll то оп. is вернёт ложный результат, так как сравнивает в контексте RTTI DLL, а не основного приложения. Поэтому тут надо осторожно подходить к использованию объектов в DLL. Однако мне в одно время тоже приходилось использовать dll в качестве контейнера кода. Но у меня всё работало, потому как был вооружён. ![]() Это сообщение отредактировал(а) cat512 - 23.9.2010, 19:55 |
|||
|
||||
AlexLogos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Да действительно, я не в курсе был что в ДЛЛ свой Application. Темой ДЛЛ занялся недавно, да и в умной книге по Делфе таких тонкостей не было. По свободе опробую все что ты сказал.
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
если это и все что делается с формой, то Application вообще не нужен. Делай так
Добавлено через 1 минуту и 18 секунд Или еще лучше: убрать Free, и в OnClose формы делай Action := caFree -------------------- Обижено школьников: 8 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |