Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделяем память в DLL, а освобождаем в главном приложении… [D7, WinXP]


Страницы:   1 2

gdaujk ©   (2006-09-26 13:29:00) 

Доброго времени суток, уважаемые Мастера.
Не так давно я спрашивал, как передавать данные в DLL без использования ShareMem. Сошлись на том, что выделение, освобождение и изменение размеров блока памяти должны происходить либо только в DLL, либо только в главном приложении.

Сейчас опять встретился с этой проблемой. Мне всё-таки хочется выделять память в DLL, а освобождать в главной программе. И показалось мне, что всего-то надо в библиотеке попросить памяти не у библиотечного менеджера кучи, а у менеджера главного приложения. Вот я и написал в DLL:

procedure FillArrWithMainMemMgr(MemMgr: TMemoryManager; var A: Pointer;
 aSize: Integer); stdcall;
var
 I: Integer;
begin
 A := MemMgr.GetMem(aSize * SizeOf(Real));
 for I := 0 to aSize - 1 do
   TRealArr(A)[I] := I;
end;


а в главном приложении:

type
 TRealArr = array of Real;

procedure TForm1.FormActivate(Sender: TObject);
var
 A: Pointer;
begin
 GetMemoryManager(MemMgr);
 FillArrWithMainMemMgr(MemMgr, A, 1000);
 Label1.Caption := FloatToStr(TRealArr(A)[5]);
 ReallocMem(A, 7*SizeOf(Double));
 Label2.Caption := FloatToStr(TRealArr(A)[6]);
 FreeMem(A);
end;


Всё работает вроде. Вы, может быть, меня параноиком сочтёте, но кажется мне, что что-то здесь неладно. Подскажите, может ли с этим кодом возникнуть проблемы, например, с последующими версиями Delphi или Windows? Пойдёт ли такая библиотека с приложениями на других языках?


Сергей М.   (2006-09-26 14:05:00) [21]


> Reindeer Moss Eater ©   (26.09.06 13:36) [2]


Ну, положим, не везде и всюду там, в Виндовине, дело обстоит именно так ...но в целом и общем, т.е. в большинстве, оно именно так и обстоит)

Это я для пущей наглядности картины


Сергей М.   (2006-09-26 13:36:00) [22]


> И показалось мне, что всего-то надо в библиотеке попросить
> памяти не у библиотечного менеджера кучи, а у менеджера
> главного приложения


Ну и с чего ты взял, что хост-приложение обязано быть Делфи-приложением ?
Ты вон stdcall-спецификатор указал в объявлении ф-ции FillArrWithMainMemMgr, значит, ты заранеепредполагаешь необязательность зазработки хост-приложения искл-но в делфи. А раз так, то о какой TMemoryManager может идти речь ?

Если уж на то пошло, то единым универсальным менеджером памяти д.б. такой менеджер, который известен приложениям, разработанным в любыхсредах разработки для соотв.платформы...


Reindeer Moss Eater   (2006-09-26 13:36:00) [23]

Подскажите, может ли с этим кодом возникнуть проблемы,

Обязательно возникнут недоумения у пользователей такой библиотеки.
Так как все нормальные люди с молоком матери впитали метдо двойного вызова принятый в Windows.
В первом вызове длл возвращает требуемый размер, а во втором сами данные в подготовленный буфер.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо