вернуть TCollection или массив объектов из Dll - PullRequest
2 голосов
/ 14 сентября 2010

Я пытался вернуть из функции dll свой собственный объект (полученный из TCollection). Я использовал FastMemoryManager, но безуспешно ... Поэтому я попытался вернуть динамический массив некоторых объектов.
Длина массива множества конечно в функции dll. Это работает очень хорошо, но выделенная память не освобождается.
(Я измеряю с помощью Windows Tarsk Manager). Есть ли возможность освободить динамический массив? Процедура, которая вызывает функцию dll, находится в потоке, и в конце я имею следующее:

for i := 0 to length(MyObjectArray) - 1 do begin
  if MyObjectArray[i] <> nil then
     MyObjectArray[i].Free;
end;
Setlength(MyObjectArray, 0);
MyObjectArray := nil;

Если я использовал вместо Setlength (MyObjectArray, 0) и MyObjectArray: = nil,
FreeAndNil (MyObjectArray) Возникла исключительная ситуация.

Есть предложения?

1 Ответ

6 голосов
/ 14 сентября 2010

Является ли ShareMem первым модулем во всех файлах проекта Delphi DLL и EXE? FastMM уже является диспетчером памяти RTL для нескольких последних выпусков Delphi.

Я бы рекомендовал вообще не делиться объектами между DLL и EXE; это просто рецепт боли. Вместо этого используйте пакеты.

Если вам необходимо использовать библиотеки DLL, я бы посоветовал принять обычные соглашения WinAPI: соглашение о вызовах stdcall, используя только C-совместимые типы данных (целые числа, числа с плавающей точкой, указатели, записи, которые не имеют полей управляемых типов, таких как строки, массивы или интерфейсы). Пусть DLL не выделяет память, которую EXE-файл отвечает за освобождение. Вместо этого пусть EXE выделяет и передает DLL память; в качестве альтернативы, инкапсулируйте выделения в логические дескрипторы и экспортируйте функции, которые распоряжаются памятью из DLL, по примеру, например, как работает CloseHandle функция WinAPI.

...