Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Выделение памяти для массива в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
6-1133493728
Component TIdNNTP
2005-12-02 06:22
2006.08.27
Indy Как избавиться от зависаний при закачке?


15-1153997361
ПЛОВ
2006-07-27 14:49
2006.08.27
Примерчик бы :-)


2-1154785530
susergey
2006-08-05 17:45
2006.08.27
работа с текстовым файлом


5-1138281758
ronyn
2006-01-26 16:22
2006.08.27
Встроеное контекстное меню


2-1154607940
FFFF
2006-08-03 16:25
2006.08.27
Размер отчета