![]() |
Динамическое подключение DLL
Доброго времени суток!
Не могу разобраться, как проиходит возврат результата из процедуры в динамической бибилиотеке. У меня в программе вызов библиотеки происходит успешно, вызов процедуры происходит успешно, занчение в процедуру передается, а вот получить данные из нее не выходит (возникает access violation at...). Вот код библиотеки: Код:
library mydll; Код:
uses |
Я так понимаю проблема именно с возвратом строки, потому что числовые переменные возвращаются успешно, символьный тип char тоже. ????????????????????????
|
Вообщем буду использовать тип ShortString, здесь строка имеет фиксированный размер до 255 символов и без проблем возвращается из dll. В моем понимании проблема при работе с памятью, string передается фиксированно (размер который имеет строка до вызова dll) и по идее мы не можем изменить его в dll.
Не совсем я разобрался с указателями... Если кто может, разжуйте пожалуйста, как можно передать именно string. |
Использовать Дельфовые типы при движении данных между ДЛЛ - крайне неправильный подход. Начиная с несовместимости с другими языками и кончая бяками типа той, что получили.
Надо использовать безопасные типы данных. Если требуется увеличивать что-то то память под увеличение надо выделять в вызывающей программе. Учитывайте, что хоть ДЛЛ и использует ту же область данных, что и вызывающая программа, менеджер памяти у нее другой. Это же в полной мере относится и к передаче любых объектов: даже объекты казалось бы одного типа в ДЛЛ и вызывающей программе имеют по факту РАЗНЫЙ тип. И словить АВ можно в любой момент. Причем ошибка будет плавающей. Числовые переменные возвращаются правильно так как они имеют строго заданный размер и под них не происходит дополнительное выделение памяти. Для строк при передаче используйте pChar, pWideChar и т.п. При этом, память надо выделять заранее. Посмотрите правила вызова системных функций, которые в аргументах возвращают данные переменной длины. |
AlexVol,
За заметку про несовместимость типов с другими языками спасибо. Не подумал, вернее забыл, shortstring это ж delphi, ну хотя в Си билдере есть smallstring, а вот в Си# хз. |
Советую почитать блог GunSmoker'а. Много интересного найдете. http://www.gunsmoker.ru
Почитайте про систему плагинов - там много подводных камней освещено. |
AlexVol,
Спасибо, буду разбираться. Ещё бы хотелось найти какое-нибудь нормальное описание работы менеджера памяти в delphi. |
Да там же есть :)
Например: http://www.gunsmoker.ru/2009/01/blog-post.html И еще можно пользоваться поиском... |
Немного не в тему, но... Ни у кого нет опыта использования в качестве безопасного инкапсулирования переносимых данных средств OLE? Там, массивы ихние, и прочее. Я, конечно понимаю, что по этому поводу еще Агутин пел нечто вроде:
OLE, OLE - это просто слезы! OLE, OLE - ничего нельзя понять! Тем более при ущербной документации от производителя. Но, может, кто-то постиг практически? |
Цитата:
Так что универсальное средство вряд ли существует. И кроме описания производителя есть только один грандиозный метод: научного тыка. |
XPEHOMETP, это не немного, это совсем не в тему :)
|
AlexVol,
Спасибо ещё раз, вот ресурс, который ты мне посоветовал прям в тему, особенно про плагины... P.S. Вообщем сейчас dll с freemem пишу, значит плагины тоже с делфи писать будут :) |
Время: 18:42. |
Время: 18:42.
© OSzone.net 2001-