Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Для новичков > Помогите разобраться с DLL |
Автор: AlexLogos 20.9.2010, 09:57 | ||||||
Привет народ. Хочу разобраться с DLL. Уже который раз начинаю да все никак не закончу. Есть у меня df.dll со следующим кодом
В программне я описываю ее
Вызываю по нажатию кнопки
Появляеться окошко вызванной формы, но "надено 4776177 записей", по закрытии этой формы - AV и плюс ко всему когда закрываю основную прогу - форма исчезает, но процесс остается в памяти. Где я ошибся? |
Автор: aleksh 22.9.2010, 17:12 |
а что будет если этот код использовать не в длл а в основном проекте? работает нормально? покажи реализацию TSameRecord |
Автор: AlexLogos 22.9.2010, 17:28 | ||
Кода много, кое-где он однообразен, поэтому укорочу
Может дело в том что TSameRecord ссылается на другие юниты? |
Автор: aleksh 22.9.2010, 18:01 |
странно, может форма, которая вызывает процедуру в длл перед этим уничтожается... а почему freeandnil сразу после появления формы, может прописать его в деструкторе? и еще - попробуй описать эту процедуру там же, откуда вызываешь и проверь как работает |
Автор: AlexLogos 23.9.2010, 09:44 | ||
Процедура которая описана в ДЛЛ взята из юнита форми, там она работает нормально. Я хотел несколько уменьшить код юнита и решил перенести несколько процедур в ДЛЛ. Начал из самой простой. Форма которая вызывает не уничтожается. Я будрал FreeAndNil(Same); из ДЛЛ, и изменил тип передаваемых параметров так как ДЛЛ плохо работает со String.
Теперь количество "Найдено ... записей" отображается праивльно, но по надатию на кнопки формы - получаю AV, да и после закрытия всех форм и программы - процес и дальше торчит в памяти... Какие особенности работы с ДЛЛ не учел я в работе? |
Автор: cat512 23.9.2010, 09:57 | ||
Если нет жёстких требований по использованию именно 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 в качестве контейнера кода. Но у меня всё работало, потому как был вооружён. ![]() |
Автор: AlexLogos 25.9.2010, 10:23 |
Да действительно, я не в курсе был что в ДЛЛ свой Application. Темой ДЛЛ занялся недавно, да и в умной книге по Делфе таких тонкостей не было. По свободе опробую все что ты сказал. |