Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизВыделение памяти для массива в DLL. Найти похожие ветки
← →
gdaujk © (2006-08-03 17:57) [0]Доброго времени суток, уважаемые Мастера. Ситуация следующая: в библиотеке есть экспортируемая функция:
function Example(var a: array of Real): Boolean;
begin
//
end;
Подскажите, как внутри этой функции выделить (освободить) память для массива без использования ShareMem и функции SetLength ?
← →
Ketmar © (2006-08-03 18:06) [1]точно так же, как скомпилировать программу на дельфи, не имея установленной дельфи и вообще не имея компьютера в области досягаемости.
← →
Ketmar © (2006-08-03 18:06) [2]орешек.
← →
Reindeer Moss Eater © (2006-08-03 18:37) [3]getmem
← →
Ketmar © (2006-08-03 18:39) [4]> [3] Reindeer Moss Eater © (03.08.06 18:37)
getbug. служебные области кто заполнять будет?
← →
Ketmar © (2006-08-03 18:40) [5]ну и -- без ShareMem с менеджером памяти случится злой маразм.
← →
DiamondShark © (2006-08-03 18:49) [6]Ничего страшного без ШареМем не случится.
Если, конечно, память отдавать на освобождение туда же, где она и выделялась.
← →
Ketmar © (2006-08-03 19:25) [7]> [6] DiamondShark © (03.08.06 18:49)
ну да. пардон, забыл это уточнить. %-)
← →
begin...end © (2006-08-03 19:30) [8]А о каком массиве идёт речь? Об
a
? Так ведь это же открытый массив.
← →
gdaujk © (2006-08-03 19:57) [9]Извиняюсь, немного неправильно сформулировал задачу. В общем надо было внутри DLL инициализировать и заполнить область памяти, которую потом (в виде массива) могло бы использовать главное приложение.
Согласен и с Ketmar (насчёт ореха :-) и с DiamondShark. Привожу то, что получилось. Если есть варианты получше, выкладывайте.library Project1;
uses
Windows;
type
TRealArr = array of Real;
PRealArr = ^TRealArr;
function Example(var A: Pointer; aSize: Integer): Boolean; stdcall;
var
I: Integer;
begin
A := VirtualAlloc(nil, aSize * SizeOf(Real), MEM_COMMIT, PAGE_READWRITE);
for I := 0 to aSize - 1 do
TRealArr(A)[I] := I;
end;
procedure dgaFillArray(var A: Pointer; aSize: Integer); stdcall;
var
I: Integer;
begin
GetMem(A, aSize * SizeOf(Real));
for I := 0 to aSize - 1 do
TRealArr(A)[I] := I;
end;
procedure dgaFreeArray(var A: Pointer); stdcall;
begin
FreeMem(A);
end;
exports
Example, dgaFillArray, dgaFreeArray;
begin
end.
В главном приложении:type
TRealArr = array of Real;
PRealArr = ^TRealArr;
function Example(var A: Pointer; aSize: Integer): Boolean; stdcall;
procedure dgaFillArray(var A: Pointer; aSize: Integer); stdcall;
procedure dgaFreeArray(var A: Pointer); stdcall;
implementation
function Example; external "Project1.dll" name "Example";
procedure dgaFillArray; external "Project1.dll" name "dgaFillArray";
procedure dgaFreeArray; external "Project1.dll" name "dgaFreeArray";
procedure TForm1.FormActivate(Sender: TObject);
var
P: Pointer;
A: Pointer;
begin
Example(P, 10);
Label1.Caption := FloatToStr(TRealArr(P)[5]);
VirtualFree(P, 0, MEM_RELEASE);
dgaFillArray(A, 10);
Label2.Caption := FloatToStr(TRealArr(A)[5]);
//FreeMem(A); // ошибка
dgaFreeArray(A); // правильное освобождение памяти
end;
← →
Ketmar © (2006-08-03 21:29) [10]зачем Example возвращает Boolean, и почему проигнорирован warning компилятора в этом месте?
а так -- теперь всё более-менее прилично на первый взгляд. %-)
зыж не надо использовать Real, оно obsolete. %-)
← →
Reindeer Moss Eater © (2006-08-04 10:21) [11]getbug. служебные области кто заполнять будет?
А что, это невозможно?
← →
Ketmar © (2006-08-04 11:28) [12]> [11] Reindeer Moss Eater © (04.08.06 10:21)
возможно. но хак. да и не упомянуто об этом в [3]. %-)
← →
Desdechado © (2006-08-04 12:28) [13]Хорошим тоном считается выделить память в проге, подсунуть адрес в DLL, там с ней чего-то поделать и вернуть в прогу, в проге чего-то поделать и освободить память.
Обрати внимание, как работает большинство winAPI-функций - они просят буфер для чего-то ДО запуска.
← →
Ketmar © (2006-08-04 12:44) [14]> [13] Desdechado © (04.08.06 12:28)
ну, это если универсальная DLL. а если своя личная, и никому больше не нужна -- то тут уже, имо, удобство важнее. %-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c