| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Indy и DLL и Access Violation |
| Автор: Kelas 31.8.2006, 17:51 | ||||
| Мне по учебе нужно добавить к проекту DLL. Проэкт - база данных, работающая с клиентами с помощью компонентов TIdTCPClient и TIdTCPServer - этакая удаленная база вручную. Я решил перенести все функции работы с этими компанентами в DLL. Создал новый проект DLL-ки, добавил к uses юнит с процедурками и выписал все нужные в Exports. Все нормально скомпилировалось, я подключил библиотеку к проекту функцией LoadLibrary и для начала заменил функцию которая стучится по указанному порту и адрсу к серверу и проверяет, есть ли там вто живой. Вот эта функция:
А вот код в проекте где вытаскивается она из DLL и вызыается:
Во время работы функции возникает Access Violation c чтением нулевого адреса, на строчке "WriteInteger(taInitCheck);" в модуле KB_TCP.dll Если та же функция, слово в слово будет использоваться в проекте, тоесть как бы локально, а не вызываться из DLL то никаких ошибок не возникает и все работает как часы... |
| Автор: Yanis 1.9.2006, 09:08 |
| Что такое CruiserForm.cTCP? |
| Автор: Matematik 1.9.2006, 09:12 |
| CruiserForm.cTCP это кажется TIdTCPClient По мне сомнительная операцие передавать в dll указателлльна экземпляк объекта и там с ним работать... |
| Автор: Snowy 1.9.2006, 09:32 |
| dll и передача объектов - понятия несовместимые. Используй bpl или выделяй в dll только полностью отделённый логический код. Хотя в принципе непонятно, зачем тебе вообще dll? |
| Автор: Kelas 1.9.2006, 17:40 | ||
| Спасибо Yanis, твой метод работает, однако проблема была не в этом, с загрузкой библиотеки и получением адреса функции у меня проблем не было, я тоже грузил библиотеку с помощью LoadLibrary просто происходило это не в функции обработки кнопки. Проблема как сказал Snowy, и подозревал Matematik, в том, что я работал с методами объекта. Странно конечно, что функция Connect все равно срабатывала без ошибок, но WriteInteger он, несмотря на это, не переваривал. Я переделал функцию - просто созал "локального клиента" в функции и передал Host и Port в него с помощью уже передававшегося указателя - читает он вроде без Access Violation'ов. Вот итоговый код функции, если это кому-то интересно:
|
| Автор: Snowy 1.9.2006, 17:52 |
| Просто класс, скомпиленный в exe и он же скомпиленный в dll - это уже 2 разных класса. Для готового кода они совсем не равны. Класс и работа с ним должны быть описаны в одном месте - либо в dll, либо в exe. Добавлено @ 17:56 Потому что Connection прописана в виртуальной таблице, а WriteInteger фиксированно. |