2010-09-14 5 views
2

Я попытался вернуть из dll функцию свой собственный объект (полученный из TCollection). Я использовал FastMemoryManager, но без успеха ... Поэтому я попытался вернуть динамический массив некоторых объектов.
Длина массива, конечно, в функции dll. Он работает с реальной надежностью, но выделенная память не освобождается.
(Я измеряю с помощью менеджера Windows tarsk). Есть ли возможность освободить динамический массив? Процедура, которая вызвать функцию DLL находится в потоке, и в конце концов у меня есть следующие:return TCollection или массив объектов из 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: = ноль,
FreeAndNil (MyObjectArray) исключение был поднят.

Любое предложение?

+0

От вас [последний вопрос] (http://stackoverflow.com/questions/3529039/delphi-plugin-framework), я думал, что вы решили * не * использовать DLL. Почему вы решили использовать их в любом случае? –

+0

Этот вопрос связан с другим проектом, гораздо проще. Я просто хочу переместить некоторые функции из exe в dll без большой передачи данных между ними. Мой другой вопрос, о чем вы упоминаете в своем комментарии, касается проекта, в котором мне нужны TFrames и TForms для включения в основное приложение в качестве детей MDI и т. Д. Таким образом, BPL или другие альтернативы по-прежнему актуальны;) – Peter

ответ

6

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^