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

Вниз

Корректная работа с памятью.   Найти похожие ветки 

 
pargo ©   (2006-05-05 11:31) [0]

Корректен ли следующий код, если нет, то в чем ошибка ?

library TestDLL;

uses
 SysUtils,
 Windows;

procedure DLL_FreeMem(var pData:pByte); export; stdcall;
begin
ReallocMem(pData,0);
end;

procedure TestProc(var pData:pByte; var cbData:DWord); export; stdcall;
begin
cbData:=cbData+1024;
ReallocMem(pData,cbData);
end;

exports
DLL_FreeMem name "DLL_FreeMem",
TestProc name "TestProc;
begin
end.

В проекте:

procedure TestMem(var pData:pByte; var cbData:DWord);
begin
ReallocMem(pData,cbData);
TestProc(pData,cbData);
DLL_FreeMem(pData);
end;


 
Сергей М. ©   (2006-05-05 11:37) [1]


> Корректен ли следующий код


Некорректен.

Хотя бы потому что когда-нибудь на месте тестового Делфи-приложения окажется реальное не-Делфи-приложение, которое будет использовать совершенно иной менеджер памяти.


 
evvcom ©   (2006-05-05 11:51) [2]

Даже для Дельфи-приложений мы имеем 2-х разных менеджеров. Один память выделяет, а другой, ничего об этом не зная, пытается ее перевыделить, а потом убить.


 
Сергей М. ©   (2006-05-05 11:54) [3]


> evvcom ©   (05.05.06 11:51) [2]


Угу. В частном случае.


 
pargo ©   (2006-05-05 12:02) [4]

Подскажите, как сделать правильно ?


 
TUser ©   (2006-05-05 12:07) [5]

А что ты хочешь сделать?


 
pargo ©   (2006-05-05 12:51) [6]

Передать данные в DLL. Там обработать их ( при этом размер данных
меняется ) и вернуть обработанные данные в проект.


 
Сергей М. ©   (2006-05-05 13:03) [7]


> pargo ©   (05.05.06 12:51) [6]


stdcall с какой целью тобой указан ? От балды ?


 
pargo ©   (2006-05-05 13:07) [8]

Сергей М. ©   (05.05.06 13:03) [7]
Просто указываю для всех экспортируемых функций, независимо
от количества параметров.


 
balepa ©   (2006-05-05 13:10) [9]


> pargo ©   (05.05.06 13:07) [8]
> Просто указываю для всех экспортируемых функций, независимо
> от количества параметров.


Значит от балды


 
Сергей М. ©   (2006-05-05 13:15) [10]


> pargo ©   (05.05.06 13:07) [8]


Именно от балды.

А следовало бы призадуматься над этой "балдой" ..


 
evvcom ©   (2006-05-05 15:44) [11]

Да, задуматься не мешает, о чем здесь говорилось. Но главная ошибка заключается в том, что память освобождать (перевыделять) надо там (в том модуле), где она запрашивалась.


 
pargo ©   (2006-05-05 16:44) [12]

Спасибо


 
pargo ©   (2006-05-08 12:27) [13]

Так будет корректно ?
library TestDLL;

uses
SysUtils,
Windows;

procedure DLL_ReallocMem(var pData:pByte;Size:DWord); export; stdcall;
begin
ReallocMem(pData,Size);
end;

procedure TestProc(var pData:pByte; var cbData:DWord); export; stdcall;
begin
cbData:=cbData+1024;
ReallocMem(pData,cbData);
end;

exports
DLL_ReallocMem name "DLL_ReallocMem",
TestProc name "TestProc;
begin
end.

В проекте:

procedure TestMem(var pData:pByte; var cbData:DWord);
begin
DLL_ReallocMem(pData,cbData);
TestProc(pData,cbData);
DLL_ReallocMem(pData,0);
end;


 
Пусик ©   (2006-05-08 18:15) [14]


> pargo ©   (08.05.06 12:27) [13]


Так корректно.



Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
15-1147685730
SamProf
2006-05-15 13:35
2006.06.18
Не могу поставит Delphi 8


4-1142853676
KALqYAN
2006-03-20 14:21
2006.06.18
CPU Usage


1-1147256646
Mishenka
2006-05-10 14:24
2006.06.18
Событие OnDblClick в ListView с CheckBoxes = True ?????


2-1148732237
VANAP
2006-05-27 16:17
2006.06.18
Сохранение в Paradox и фильтр


2-1149154398
.ruslan
2006-06-01 13:33
2006.06.18
MonthCalendar1