Инструменты пользователя

Инструменты сайта


remobject_pascal_script:podkljuchenie_dll

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
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 и т.д.) их использование обязательно приведёт к ошибке. ​  
 +
remobject_pascal_script/podkljuchenie_dll.txt · Последние изменения: 2018/12/05 11:18 — jurist23rus