PDA

View Full Version : برداشتن فایل DLL از حافظه



spicirmkh
یک شنبه 09 بهمن 1384, 10:56 صبح
سلام

فرض کنید 2 تا فایل DLL داریم به نام Dll1 و Dll2

حال Dll1 فایل Dll2 را فرا می خواند بعد بوسیله کلیدی می خواهم فایل Dll1 را فرا خوانی کنیم با پارامتر داده شده جدید

مشکلی وجود دارد که فایل Dll1 در حافظه هست چگونه می توانیم Dll1 از حافظه برداریم و دوباره بار گذاری کنیم

با نتشکر

vcldeveloper
یک شنبه 09 بهمن 1384, 13:20 عصر
شما فایل DLL را فراخوانی نمی کنید، بلکه تابعی که در این فایل export شده را فراخوانی می کنید. اگه فایل قبلا در حافظه لود شده باشه، فقط فایل DLL مربوطه در فضای آدرس پروسه شما Map میشه و اون تابع فراخوانی میشه؛ اگر فایل DLL در حافظه لود نشده باشه، اول لود میشه و بعد مراحل فوق تکرار میشه. نتیجه اینکه چه فایل شما از قبل لود شده باشه و چه لود نشده باشه، شما باید بتونید به راحتی تابع مورد نظرتون را از داخل DLL فراخوانی کنید.

spicirmkh
یک شنبه 09 بهمن 1384, 13:43 عصر
با سلام

آقای کشاورز با تشکر از ارسال جواب

فرض کنید برنامه اصلی فایل Dll1 صدا می زند و Dll1 فایل Dll2 و همین طور توی Loop که فایل Dll2 فایل Dll1 صدا می زند بعد مدتی پیغام خطا حافظه می دهد

با تشکر

spicirmkh
یک شنبه 09 بهمن 1384, 15:33 عصر
سلام

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

با تشکر

anubis_ir
یک شنبه 09 بهمن 1384, 15:38 عصر
مشکل نشتی حافظه و یا خطا رو باید در یکی از توابع جستجو کنید نه در بارگذاری dll ها در حافظه.

spicirmkh
یک شنبه 09 بهمن 1384, 15:40 عصر
برنامه ضمیمه کردم

vcldeveloper
دوشنبه 10 بهمن 1384, 04:22 صبح
لازم نیست فایل های EXE و ِDLL کامپایل شده را ارسال کنید، فقط سورس مورد نظر را ارسال کنید کافیه...اینطوری کسی مجبور نمیشه برای رفع مشکل شما با خط Dial-up حدود 1.7 مگ دانلود کنه ;-)

spicirmkh
دوشنبه 10 بهمن 1384, 08:01 صبح
سلام

معذرت می خواهم به روی چشم !!!!!
سورس Dll1 که درون اش Dll2 را صدا می زند




function SDll1() : Bool;
var
Form1: TForm1;
begin
Form1 := TForm1.Create(nil);
try
Result := (Form1.ShowModal = mrOK);
finally
Form1.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
SDll2 : TSDll2;
Mutex : THandle;
begin
Mutex := CreateMutex(nil, True, 'DLL2');

if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
begin
SDll2;
Exit ;
end
;
CloseHandle(Mutex);
Mutex := CreateMutex(nil, True, 'DLL1');


LibHandle := LoadLibrary('Dll2.dll');
try
if LibHandle = HINSTANCE_ERROR then
raise EDLLLoadError.Create('Unable to Load DLL');
@SDll2 := GetProcAddress(LibHandle, 'SDll2');
// ShowFormPublisher(0);
if not (@SDll2 = nil) then
SDll2;
finally
FreeLibrary(LibHandle);
end;
CloseHandle(Mutex);

end;



سورس Dll2 که درون اش Dll1 را صدا می زند



function SDll2() : Bool;
var
Form1: TForm1;
begin
Form1 := TForm1.Create(nil);
try
Result := (Form1.ShowModal = mrOK);
finally
Form1.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
LibHandle: THandle;
SDll1 : TSDll1;
Mutex : THandle;
begin
Mutex := CreateMutex(nil, True, 'DLL1');

if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
begin
SDll1;
Exit ;
end
;
CloseHandle(Mutex);
Mutex := CreateMutex(nil, True, 'DLL2');


LibHandle := LoadLibrary('Dll1.dll');
try
if LibHandle = HINSTANCE_ERROR then
raise EDLLLoadError.Create('Unable to Load DLL');
@SDll1 := GetProcAddress(LibHandle, 'SDll1');
if not (@SDll1 = nil) then
SDll1;
finally
FreeLibrary(LibHandle);
end;
CloseHandle(Mutex);

end;



با تشکر

Naficy
سه شنبه 11 بهمن 1384, 09:09 صبح
ببینم، شما دقیقا دنبال چه کاری هستین؟

spicirmkh
سه شنبه 11 بهمن 1384, 13:13 عصر
سلام
دقیقا برنامه ای دارم که شامل 2 تا فایل Dll است

برنامه اول فایل Dll اولی صدا می زند
بعد Dll اولی dll دومی فرا می خواند
بعد dll دومی Dll اولی

همین طور Loop ادامه دارد

Naficy
چهارشنبه 12 بهمن 1384, 09:34 صبح
عجب توضیح روشن و جالبی.
بدنیست من هم به همین صورت راهنماییتان کنم ببینم چی می شه.
به هرحال احتیاجی به ساختن mutex و... ندارید. کدتون رو بدون وجود اینها بنویسید. همینطور عملیات LoadLibrary را بهتر است (اجباری وجود ندارد) در بین begin و end قرار دهید (و FreeLibrary را درون یک dllproc)

spicirmkh
چهارشنبه 12 بهمن 1384, 09:39 صبح
سلام

ممنونم از راهنمائی

اما مشکل اینجا است که وقتی توی LOOP می افتد فرم قبلی باز است و فرم متعدد باز می شود تا جائی که حافظه پیغام خطا بدهد

با تشکر

Naficy
چهارشنبه 12 بهمن 1384, 09:50 صبح
برای اینکار کافیست تست کنید فرمتان قبلا ساخته شده یا نه. (به کمک یک متغیر عمومی)
مثلا مقدار متغیر Form1 را - که به صورت عمومی تعریف خواهید کرد - را با nil مقایسه کنید. (البته در این صورت لازم است که در جایی مثل begin و end، متغیر را برابر nil قرار دهید، تا با اولین لود شدن dll، مقدار متغیر معین باشد)

spicirmkh
چهارشنبه 12 بهمن 1384, 09:57 صبح
فرم در DLL قبلی ایجاد شده

همانطور گرفتم DLL اولی فرم ایجاد می کند و بانکی در Dbisam باز میکند بعد Dll دومی فرا می خواند
Dll دومی هم فرم و بانک دیگر باز میکند
حال چگونه فرم و بانک و Dll اولی را ببندم

من یک برنامه ضمیمه کردم شاید با مثال متوجه بشوید

با تشکر

Naficy
پنج شنبه 13 بهمن 1384, 18:23 عصر
ببینید، وقتی پرسیده می شه "دقیقا چه کار می خواهید بکنید" یعنی یه توضیحی مشابه آنچه در پست اخیرتان دادید، در مورد کارتان بدهید. (البته توضیحی یه مقدار کاملتر!)

من متوجه نمی شم که چرا می خواهید dll اولی از حافظه بیرون بره. کافی نیست که فرم و بانک را ببندید؟ برای اینکار هم باید همونطور که تابعی به نام SDll2 دارید، تابعی مثلا به نام CloseDllForm2 داشته باشید که فرم و بانک را ببندد.
اگر از این روش -که به نظر من بسیار هم راه حل بدیهی ای است- استفاده کنید، آنوقت می توانید با FreeLibrary، خود dll را هم از حافظه Unload کنید.

شدیدا توصیه می کنم راهنمای LoadLibrary و FreeLibrary را هم بخوانید.
**********
ضمنا اگر هنوز جوابتون رو نگرفتید، لطف کنید کمی حوصله به خرج دهید و دقیقا بنویسید چرا چنین کاری را می کنید. از چه راههایی رفته اید و دقیقا چه مشکلاتی در هریک از راهها داشته اید. مطمئن باشید اگر خودتان حوصله توضیح دادن در رابطه با مشکلتان را نداشته باشید، هیچ کس دیگر هم حوصله فهمیدن آنرا ندارد.

موفق باشید.

spicirmkh
شنبه 15 بهمن 1384, 08:22 صبح
سلام

ممنونم از توجه تان ، سعی می کنم کامل تر توضیح بدهم


برنامه اصلی یک فایل Dll_Book صدا می زند که :

که یک فرم داریم که عنوان کتاب است شامل فیلد متعددی از جمله نام ناشر .

حال فایل دیگر داریم بنام DLL_Pub که توسط فرم کتاب صدا می زند

Dll_BOOK --- >> DLL_ PUB

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

Dll_PUB ----> DLL_BOOK

اگر من فرم کتاب باز کنم فرم قبلی وجود دارد و باز است
اگر فرم جدیدی باز کنم تعداد فرم زیاد می شود

امیداوارم توانسته باشم توضیح داده باشم
با تشکر

Naficy
یک شنبه 16 بهمن 1384, 08:19 صبح
بله. متشکر از توضیحتان.
تا اینجا به نظر من می رسه که شما هنوز طراحی برنامه رو تموم نکردید. یعنی شک دارید که فرم جدید باز کنید یا در همان فرم قبلی اطلاعات را نمایش دهید.
مباحث مرتبط با پیاده سازی و... را کنار بگذارید. فقط به کاری که "خوب است" برنامه انجام دهد فکر کنید. ببینید می خواهید کاربر با کلیک روی نام یک کتاب، یک پنجره جدید باز کند یا در همان پنجره قبلی اطلاعات نمایش داده شود.
1 - اگر با کلیک روی نام هر کتاب، فرم جدیدی باز شود ---> مسلما تعداد فرمها زیاد می شود.
2 - اگر با کلیک روی نام هر کتاب، همان فرم قبلی با اطلاعات جدید بروز شود ---> تعداد فرمها زیاد نمی شود، اما "شاید" برای کاربر خیلی جالب نباشد.
این مساله ای است که خودتان باید تصمیم بگیرید. بعد در مورد پیاده سازی اش صجبت خواهیم کرد.

البته بعد از خواندن پستتان من درست متوجه نشدم که شما انتخاب خودتان را کرده اید یا نه.
ضمنا نفهمیدم چرا می خواهید فرمها را در dll قرار دهید؟ و چرا آنها را در خود برنامه exe قرار نمی دهید؟

spicirmkh
یک شنبه 16 بهمن 1384, 10:05 صبح
سلام

من یک پروژه بزرگی نوشتم که ثبت سفارش کتاب است
که شامل یک برنامه EXE است بدنه اصلی برنامه و 10 فایل DLL مثل

مشتریان
مشخصات اصلی کتاب
مشخصات ناشر
و .....

از داخل برنامه مشخصات کتاب می شود به ناشر دست یافت و بر عکس
از داخل ناشر می شود به مشخصات کتاب

یعنی زمانی داریم یک کتاب می بینیم می خواهیم ناشر و کتابهای ناشر را ببینیم
و بعد به یک کتاب دیگر ناشر دست پیدا کنیم

یعنی لینک دو طرفه

برنامه مجبورم Dll بنویسم چون المان و فیلد و Page زیادی داره و خودش یک برنامه بزرگی است

برنامه نوشتم و کار می کند اما با Mutex کنترل می کنم

Naficy
دوشنبه 17 بهمن 1384, 11:26 صبح
شما احتیاجی به dll نوشتن ندارید. به نظر من بیخودی کار خودتان را سخت کرده اید.

spicirmkh
دوشنبه 17 بهمن 1384, 13:15 عصر
نمی شود برنامه به این بزرگی در یک فایل Exe نوشت

سید مسعود موحد
دوشنبه 17 بهمن 1384, 14:15 عصر
برنامه های بزرگتر از این هم در یک Exe قرار گرفته مانند سیستم مالی

spicirmkh
دوشنبه 17 بهمن 1384, 14:29 عصر
حال اصلا دعوا سر DLL نیست

سوال این جوری یک فایل بسیار بزرگی Exe داریم
شامل 10 فرم
فرم 1 : فرم 2 را صدا می زند و پارامتر به فرم 2 می فرستد
بعد فرم 2 فرم 1 صدا می زند و پارامتر ارسال می کند
چگونه فرم متعدد باز نشود

با تشکر