Вернуть TCollection или массив объектов из Dll
Я пытался вернуть из функции 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 ответ
Является ли ShareMem первым модулем во всех файлах проекта Delphi DLL и EXE? FastMM уже является диспетчером памяти RTL для нескольких последних выпусков Delphi.
Я бы порекомендовал вообще не делиться объектами между DLL и EXE; это просто рецепт боли. Используйте пакеты вместо.
Если вы должны использовать библиотеки DLL, я бы посоветовал принять обычные соглашения WinAPI: соглашение о вызовах stdcall, используя только C-совместимые типы данных (целые числа, числа с плавающей запятой, указатели, записи, которые не имеют полей управляемых типов, таких как строки, массивы или интерфейсы). Пусть DLL не выделяет память, которую EXE-файл отвечает за освобождение. Вместо этого позвольте EXE выделить и передать DLL память; в качестве альтернативы, инкапсулируйте выделения в логические дескрипторы и экспортируйте функции, которые распоряжаются памятью из DLL, в соответствии, например, с тем, как CloseHandle
Функция WinAPI работает.