Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
remobject_pascal_script:podkljuchenie_dll [2018/04/02 11:14]
jurist23rus
remobject_pascal_script:podkljuchenie_dll [2018/12/05 11:18] (текущий)
jurist23rus
Строка 11: Строка 11:
  
 Файл DLL должен находиться в папке с программой или в системной папке «system32». Текст подключения может быть в любом модуле. Если функция подключается в пользовательском модуле или модуле Main, то вы можете использовать эту функцию и в других модулях. Файл DLL должен находиться в папке с программой или в системной папке «system32». Текст подключения может быть в любом модуле. Если функция подключается в пользовательском модуле или модуле Main, то вы можете использовать эту функцию и в других модулях.
 +
 +===== Проблема =====
 +
 +При использовании динамических библиотек приходится соблюдать ограничение на типы данных, которые могут передаваться в параметрах процедур и функций. Если попытаться активно передавать динамические массивы и/или длинные строки (тип string), то рано или поздно возникнет AV ошибка. Кроме того, приходится следить, чтобы процедуры выделения/освобождения динамической памяти вызывались из одного и того же модуля.
 +
 +При написании сложной многомодульной базы данных эти ограничения весьма неприятны.
 +
 +===== Причины =====
 +
 +Дело в том, что Free Pascal для распределения динамической памяти использует не функции операционной системы, а свои собственные, что позволяет значительно ускорить процесс. Однако это приводит к тому, что данные о состоянии памяти, выделенных и свободных блоках и т.д. хранятся в глобальных переменных исполняемого модуля. Таким образом, пул памяти динамической библиотеки отделен от пула памяти вызывающего ее приложения. А длинные строки и динамические массивы как раз и используют (неявно) динамическую память.
 +
 +===== Решение =====
 +При передаче данных между приложением и модулем dll используйте только простые типы данных: integer, widestring, Pchar, variant и т.д. Не используйте тип string для текстовых данных - это приводит к тродноулавимым ошибкам при освобождении памяти. Вместо String используйте Widestring или PChar. Откажитесь от динамических массивов, сложных составных типов данных (record) и любых объектов (TObject, TStringList и т.д.) их использование обязательно приведёт к ошибке.   
 +