![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделяем память в DLL, а освобождаем в главном приложении… [D7, WinXP]
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.
В первом вызове длл возвращает требуемый размер, а во втором сами данные в подготовленный буфер.