كمك در مورد از حافظه خارج كردن فايل هاي dll در دلفي

moein 88

New Member
با سلام خدمت دوستان گرامي
من يك برنامه طراحي كردم كه از يك Host Application و يك فايل DLL كه داراي فرم هست تشكيل شده .
وقتي در Host Application بر روي يك Button كليك مي كنم اين DLL اجرا مي شه .ولي وقتي فرم مربوط به DLL رو مي بندم ، فايل DLL از حافظه خارج نمي شه و فضاي زيادي رو اشغال مي كنه .تا وقتي كه Host Application رو نبستم با هر بار باز شدن فرم مربوط به DLL فضاي اشغال شده Ram چند برابر مي شه .مي خواستم در اين خصوص كمكم كنيد .ممنون ميشم .
البته مي دونم كه بايد بصورت Dynamic باشه ولي نتونستم كدش رو بنويسم.
كد هاي مربوط به Host Application :

[PASS]
procedure showmdichild(MainApp: TApplication; id, namefamily, skin,
CodeManager: string); stdcall; external 'PowerLib.dll' delayed;

procedure TForm1.sButton1Click(Sender: TObject);
begin
showmdichild(Application,Edit1.Text,Edit2.Text,Edi t3.Text,Edit4.Text);
end;

[/PASS]

كد هاي مربوط به DLL :

[PASS]

var
DLLApp: TApplication;
procedure showmdichild(MainApp: TApplication;id,namefamily,skin,CodeManager:string ); stdcall;
var
Child: TForm1;
begin
if not Assigned(DLLApp) then
begin
DLLApp := Application;
Application := MainApp;
end;
Child := TForm1.Create(Application.MainForm);
Child.Show;
end;

//--------------------------------
procedure MyDLLProg(Reason: integer);
begin
if Reason = DLL_PROCESS_DETACH then
if Assigned(DLLApp) then
begin
Application := DLLApp;
end;
end;
exports showmdichild;
//--------------------------------------
begin
DllProc := MyDLLProg;
end.







[/PASS]




عكس هاي برنامه به همراه فضاي اشغال شده RAM:
اجراي بار اول
اجراي بار اول.JPG

اجراي بار دوم

اجراي بار دوم.JPG

اگه ممكنه لطفا كد درستشو واسم بزاريد .ممنون
 

moein 88

New Member
البته بعدش كد رو داخل Host Application اينجوري تغيير دادم Dynamic DLl . ولي وقتي اجرا مي كنم و روي دكمه اجراي DLL مي زنم كه فرم مربوط به DLL باز بشه ، كلا برنامه بسته ميشه
[PASS]
type
showmdichild = Procedure(MainApp: TApplication; id, namefamily, skin,
CodeManager: string);


procedure TForm1.sButton1Click(Sender: TObject);
var
libhandel: THandle;
tsadta: showmdichild;
begin
libhandel := LoadLibrary('PowerLib.dll');
try
if libhandel <= 32 then
raise Exception.Create('فايل DLL مورد نظر وجود ندارد');
@tsadta := GetProcAddress(libhandel, 'showmdichild');
if not(@tsadta = nil) then
begin
tsadta(Application, Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text);
end
else
begin
RaiseLastOSError;
end;
finally
FreeLibrary(libhandel);

end;




[/PASS]
 

جدیدترین ارسال ها

بالا