Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1140756973
Xandr
2006-02-24 07:56
2006.08.27
уровень звука


15-1153485865
McSimm
2006-07-21 16:44
2006.08.27
Продолжение ветки "Для любителей коммунизъъма (TUser)"


15-1154206733
Германн
2006-07-30 00:58
2006.08.27
"Поиск" и возврат в форум


2-1154672198
Reng
2006-08-04 10:16
2006.08.27
Прогммма сервер не отвечает


3-1150893952
1qaz
2006-06-21 16:45
2006.08.27
OLE и Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский