PDA

View Full Version : درخواست توضیح با یک مثال در مورد استفاده از Dll ها



Hamid_PaK
شنبه 25 تیر 1384, 23:47 عصر
من با یک برنامه ساده که اسمش Multimedia Builder هست بسادگی از یک Dll استفاده کردم و با Procedure هاش بسادگی کار کردم ولی هر کاری می کنم تو دلفی نمی تونم اصل استفاده از DLL ها رو یادبگیرم .

اگه ممکنه توضیح با یک مثال که به تاپیک اضافه بشه باشه ممنون می شم .
(در ضمن می دونم که این موضوع بسیار تکراریست در هر حال از دوستان عزیز تشکر می کنم)

Delphi_Developer
یک شنبه 26 تیر 1384, 01:26 صبح
برای Import کردن DLL در دلفی :
از منوی Project > Import Type Library بعد DLL رو اتخاب میکنی بعد یه Item به Pallete
Activex اضافه میشه البته اگه با پلت Default خودش Install کنی .

vcldeveloper
یک شنبه 26 تیر 1384, 03:06 صبح
برای Import کردن DLL در دلفی :
از منوی Project > Import Type Library بعد DLL رو اتخاب میکنی بعد یه Item به Pallete
Activex اضافه میشه البته اگه با پلت Default خودش Install کنی .
Type Library ها برای استفاده از DLL های معمولی بکار نمیرند، بلکه برای اشیاء COM استفاده میشند!


من با یک برنامه ساده که اسمش Multimedia Builder هست بسادگی از یک Dll استفاده کردم و با Procedure هاش بسادگی کار کردم ولی هر کاری می کنم تو دلفی نمی تونم اصل استفاده از DLL ها رو یادبگیرم .
رجوع کنید به:
http://www.barnamenevis.org/forum/showthread.php?t=15109

vesal
یک شنبه 26 تیر 1384, 03:36 صبح
شما دقیقا چه کار کردید که جواب نگرفتید؟

Hamid_PaK
یک شنبه 26 تیر 1384, 10:51 صبح
آقای کشاورز لینک کار نمی کنه چون داخل تاپیک مورد نظر شما جز یک لینک دیگه مطلب خاص دیگه ای نیست
که اون هم خراب ؟؟؟؟؟؟؟؟؟؟؟؟

Vesal جان خیلی ساده است چطوری از یک DLL استفاده کنیم ...

vcldeveloper
دوشنبه 27 تیر 1384, 11:09 صبح
شما به دو صورت می تونید به توابع داخل یک DLL دسترسی داشته باشید:
1- بصورت استاتیک : DLL همراه برنامه در حافظه لود میشه
2- بصورت دینامیک : DLL فقط در زمانی که بهش نیاز هست لود میشه و بعد از اتمام کار بالافاصله آزاد میشه.

-->اگر فرض کنیم که شما قصد اجرای تابع AFunc (دارای دو پارامتر ورودی عدد صحیح و خروجی عدد صحیح) در DLL ایی به اسم ADll رو دارید.

روش استاتیک:
فقط کافی تابع رو به شکل زیر تعریف کنی و بعد در کدت ازش استفاده کنی (پیاده سازی تابع در DLL صورت گرفته). از این روش تا دلت بخواد در یونیت Windows برای تعریف توابع API استفاده شده.
بدی این روش اینه که
1- تا زمانی که برنامه در حال اجرا باشه، DLL مربوطه هم در حافظه باقی می مونه (حتی اگه دیگه بهش نیاز نداشته باشی).
2- DLL همراه با برنامه در حافظه لود میشه، پس در صورتی که فایل DLL پیدا نشه یا به هر دلیلی قابل استفاده نباشه، برنامه اجرا نخواهد شد.
3- باید اسم DLL و تابع مورد نظر رو از قبل (در زمان کامپایل) بدونی.

--> روش دینامیک محدودیت های فوق رو نداره.


function AFunc(Num1, Num2 : integer): integer; stdcall; external 'ADll.dll' name 'AFunc';

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

روش دینامیک :
1- DLL رو در حافظه بارگزاری می کنی
2- آدرس تابع مورد نظر رو در DLL بدست میاری
3- آدرس متغیری از نوع تابع رو روی آدرس بدست اومده تنظیم میکنی.
4- تابع رو اجرا میکنی
5- در پایان DLL رو آزاد میکنی.


procedure TForm1.Button2Click(Sender: TObject);
var
hDll : THandle;
pFunc : TFarProc; //Note: TFarProc = pointer
AFunc : function (Num1, Num2 : integer): integer; stdcall;
FuncResult : integer;
begin
//Get library handle
hDll := LoadLibrary('ADll.dll');
try
//if handle is valid
if hDll > 32 then
begin
//Get function entrypoint
pFunc := GetProcAddress(hDll,'AFunc');
//if address is valid
if pFunc <> nil then
begin
@AFunc := pFunc;
//Run function
FuncResult := AFunc(2,7);
end;
end
else
raise Exception.Create('DLL file not found');
finally
FreeLibrary(hDll);
end;
end;

Hamid_PaK
سه شنبه 28 تیر 1384, 05:49 صبح
جالب و بسیار آموزنده بود آقای کشاورز ...

با تشکر فراوان از آقای کشاورز.