
Использование модуля ShareMem
Если динамическая библиотека в процессе работы использует переменные или функции, осуществляющие динамическое выделение памяти под собственные нужды (длинные строки, динамические массивы, функции New и GetMem), а также, если такие переменные передаются в параметрах и возвращаются в результатах, то в таких библиотеках обязательно должен использоваться модуль ShareMem. При этом в секции uses модуль должен располагаться на первом месте. Об этом напоминает комментарий, автоматически добавляемый в файл динамической библиотеки при создании.
Управление этими операциями осуществляет специальный диспетчер печати BORLANDMM.DLL. Он должен распространяться вместе с динамическими библиотеками, использующими модуль ShareMem.
Вызов dll-библиотеки из Visual C++
Для вызова библиотеки необходимо выполнить следующие действия:
Необходимо объявить все экспортируемые в Delphi DLL функции с ключевыми словами export; stdcall.
Файл заголовка VC++ должен объявить все функции как тип __declspec(dllexport) __stdcall
extern "C" {
int __declspec(dllexport) __stdcall plusone(int); }
Kомпилятор VC++ изменяет имена функций __stcall, так что Delphi DLL соответственно должна экспортировать эти функции. Необходима модификация имен Delphi-функций, прописанных в разделе экспорта. Например, если экспортируется функция function plusone (intval : Integer), необходимо включить следующую строку в раздел экспорта файла:
plusone name 'plusone@4'
Число, следующее за символом @, является общей длиной в байтах всех функциональных аргументов. Самый простой путь для обнаружения неправильных значений линковка VC++ программы и просмотр на наличие возможной ошибки компоновщика "unresolved external".
Необходимо создать библиотеку импорта, используя утилиту LIB из поставки VC++. Для этого необходимо вручную создать .DEF-файл для DLL с секцией экспорта, перечисляющей имена и/или порядковые номера всех экспортируемых DLL функций. Формат .DEF-файла представлен ниже.
library MYLIB
description 'Моя DLL'
exports
plusone@4
Запустите команду LIB из командной строки, в качестве параметра подставляете имя .DEF-файла. Например, LIB /DEF:MYDLL.DEF..