PDA

View Full Version : استفاده از فانکشن که MemoryStream برمیگردونه (سوال)



Mahyaa
پنج شنبه 30 شهریور 1385, 13:23 عصر
سلام

من از یک function در یک DLL استفاده میکم که این فانکشن یک TMemoryStream برمیگردونه !
به سورس dll دسترسی ندارم تا بتونم فانکشن رو اصلاح کنم .
در مورد سورس فانکشن DLL این رو میدونم که یک MemoryStream در ابتدای فانکشن Create شده و Free نشده تا به عنوان مقدار بازگشتی به بیرون Pass بشه !!

function GetResultStr : TMemoryStream;
begin
سوال من اینه که
برای Create و Free کردن MemoryStream در برنامه چکار باید بکنم ؟

آیا باید این کار رو بکنم :


var
MyStream : TMemoryStream ;
begin
MyStream := GetResultStr;

//... The rest of cod.

//free the created str in dll
MyStream.Free;
end;

یا اینکه اینطوری :


var
MyStream : TMemoryStream ;
begin
//First Create the str
MyStream := TMemoryStream.Create ;

MyStream := GetResultStr;

//... The rest of cod.

//free the created str in dll
MyStream.Free;
end;
ممنون از توجهتون . ببخشید که سوالم طولانی شد :)

ghabil
پنج شنبه 30 شهریور 1385, 18:04 عصر
استانداردش اینطوریه :



function MakeStream: TMemoryStream;
begin
Result := TememoryStream.Create
try
...
except
Free;
end;
end;

بعد زمان استفاده


with MakeStream do // یاAStream :=MakeStream
try
finally
Free;// یا AStream.Free;
end;

یعنی لازم نیست یک اینستنس از TMemomryStream رو خودت Create کنی چون تابع خودش برات ساخته فقط کافیه یک Pointer بهش نگه داری...

اما اگر اینطوری بود تابعت مثلا :


procedure ChangeStream(const AStream: TMemoryStream);

اون موقع لازم بود که اول بسازیش

Mahyaa
پنج شنبه 30 شهریور 1385, 21:42 عصر
سلام
ممنون از پاسختون .

یک سوال دیگر هم در این رابطه برام پیش اومد
در این حالت


procedure ChangeStream(const AStream: TMemoryStream);

وجود Const به چه علتیه . البته این رو میدونم که ریفرنسها رو با var نباید فرستاد ولی در مورد TMemoryStream آیا نگذاشتن Const مشکلی ایجاد میکنه(نه var و نه Const) ؟ اصولا تفاوت اینها باهم چیه ؟

البته یک سوال دیگه هم هست که بعدا میپرسم که قاطی نشه :)

ghabil
جمعه 31 شهریور 1385, 00:29 صبح
ببین TStream.Create توی حافظه یک آبجکت ایجاد میکنه ، حالا ما برای اینکه بعدا بتونیم به این آبجکت دسترسی داشته باشیم و باهاش کار کنیم یک رفرنس بهش میگیریم مثلا میگیم :
AStream:= TSTtream.Create; و باید حواسمون هم باشه هر وقت کارمون تموم شد فضای گرفته شده توسط آبجکت رو خالی کنیم (با Free) .
حالا وقتی رفرنس یک آبجکت رو به یک تابع پاس میکنی دلت میخواد مطمئن باشی که ریفرنست سالم میمونه و مثلا عوض نمیشه ، که اگه بشه بعدا مثلا نمیتونی اون آبجکت رو Free کنی یعنی در واقع اون فضایی که تو خافظه گرفته کلا گم میشه چون دیگه رفرنسی بهش نیست (که مثلا تو دات نت یا جاوا گاربج کالکتر میاد و خودش اینارو پیدا میکنه و پاک میکنه )، گذاشتن Const برای اینه که استفاده کننده از تابع خیالش راحت باشه که به ریفرنسش دست زده نمیشه و سالمه و بعد از اجرای تابع میتونه به آبجکتش دسترسی داشته باشه ، اگر نزاری هم اتفاقی نمیفته ولی خب گذاشتنش برای جلوگیری از اشتباهات احتمالیه.