05-01-2011، 10:03 PM
مخفف Dynamic Link Library است که استادان سخن از آن با نام کتابخانه پیوندی پویا یاد کرده اند..Dll حقیقتا مشابه یک کتابخانه است بدین صورت که شما کتابهایتان را در کتابخانه قرار می دهید تا بعدا به سهولت آنها را به کار بگیرید یا آنها را در اختیار دیگران قرار دهید Dll هم بر همین اساس در سیستم عامل ویندوز پیاده سازی شده است .با این تفاوت که به جای کتاب توابع خود را در آن ذخیره می کنید .Dll حاوی توابعی است که به منظور خاصی نوشته اید و می خواهید بار ها از آن استفاده کنید و حتی برنامه نویسان دیگر هم می توانند از توابع نوشته شده ی شما استفاده کنند بدون اینکه مالکیت شما بر روی آن توابع نقض شود دقیقا مشابه کتابخانه که هر کسی بنا بر نیاز خود کتابی را از کتابخانه به امانت می گیرد و پس از استفاده، آن را بر می گرداند . تفاوت دیگری که Dll با کتابخانه دارد این است که در آن واحد از یک تابع چند برنامه کاربردی می توانند استفاده کنند این هم به خاطر معماری اشتراک حافظه در سیستم عامل است و محدودیتی در استفاده از تعداد برنامه های تقاضا کننده وجود ندارد مگر اینکه حافظه سیستم جوابگو نباشد. در این مورد فرض کنید که در کتابخانه ای حقیقی به ازای هر درخواست کننده کتاب ک نسخه از کتاب بلافاصله از روی نسخه اصلی چاپ شود و به متقاضی داده شود و سپس نسخه اصلی هم در کتابخانه باقی بماند.
مزیت دیگر Dll این است فایل Dll کامپایل شده می باشد و در نتیجه سورس آن در انحصار نویسنده آن خواهد بود و فقط فایل باینری آن توزیع می شود اما برنامه نویسان دیگر می توانند از Dll استفاده کنند اما جزییات پیاده سازی آن مخفی می ماند.
Dll ها به خودی خود نمی توانند اجرا شوند و بایستی توسط برنامه های اجرائی (کاربردی ) فراخوانی شوند.
بنابراین Dll روشی کارا برای :
1. استفاده مجدد از کد
2. همکاری بین افراد
3. و توزیع توابع نوشته شده توسط برنامه نویسان می باشد.
4. علاوه بر اینها بسیاری از توابع API دستورات مربوط به خود را فقط از طریق Dll انجام می دهند ( برای مبحث Wide Hook)
بنابراین هر برنامه نویس تحت سیستم عامل ویندوز لازم است تا نحوه نوشتن Dll را بداند . در این مقاله نحوه نوشتن Dll را توسط محیط برنامه نویسی Delphi 7 شرکت بورلند که یکی از بهترین و قوی ترین کامپایلر های موجود است را شرح می دهیم و در مقاله ای دیگر نحوه فرا خوانی Dll را که نوشته ایم توسط یک برنامه ساده نشان می دهیم . بدیهی است این مقاله فقط یک استارت و جرقه می باشد و تسلط کامل بر مبحث به عهده خواننده است.
اما نوشتن Dll:
محیط برنامه نویسی Delphi 7 را اجرا کنید و از منوی File گزینه NEW و سپس گزینه Other را انتخاب کنید .
سپس در پنجره ظاهر شده گزینه Dll Wizard را انتخاب کنید و دکمه Open را کلیک کنید.
پنجره Code Editor ظاهر می شود .
به اولین خط در این پنجره نگاه کنید . قبلا هنگام نوشتن برنامه های EXE اولین عبارت Program بود اما حالا اولین کلمه library است . Library به کامپایلر می گوید که کد، مربوط به یک پروژه Dll خواهد بود.
بعد از Library یک سری توضیحات با رنگ آبی نوشته شده است که یک یاد آوری برای برنامه نویس می باشد و هیچ ارزش اجرایی ندارد . اگر زحمتی بایتان ندارد خواندن آن برای یک بار هیچ ضرر مالی و جانی به همراه ندارد و بعدا می توانید آن را حذف کنید تا برنامه تان شلوغ نشود.
بعد از آن عبارت USES قرار گرفته است . همچنانکه برنامه نویسان محترم مستحضرید!!! این عبارت یونیت های به کار گرفته شده در برنامه را تعیین می کند . به صورت پیش فرض چند یونیت فرا خوانی شده اند اما بسته به کاری که Dll قرار است انجام دهد می توانید یونیت ها را اضافه و کم کنید .برای مثال در صورتی که یکی از توابع Dll قرار است که با رجیستری کار کند در این صورت به یونیت Registry احتیاج پیدا خواهید کرد و باید آن را در لیست Uses اضافه کنید.
بعد از آن یک راهنمای کامپایلر با رنگ سبز و سپس Begin ,End پروژه قرار دارد .
در Dll هر کاری که می خواهید انجام شود به صورت تابع بنویسید توابع را قبل از begin,End تعریف کنید.همانطور که قبلا گفتم Dll قدرت این را ندارد که به تنهایی اجرا شود و باید توسط یک برنامه کاربردی یا Dll دیگر فرا خوانی شود.
خوب حالا کد نویسی را شروع می کنیم . می خواهیم تابعی بنویسیم که با استفاده از یک message Box کلمه hello را نشان دهد. یادآوری می کنم که هدف ما آشنا کردن شما با ساختار یک Dll است .
[فقط کاربران عضو شده میتوانند این لینک را مشاهده کنند]
ون می خواهیم از Message Box استفاده کنیم و تابع ShopwMessge در یونیت dialogs است بنابراین این یونیت را به لیست Uses اضافه می کنیم.
قبل از Begin تابع را بدین صورت تعریف می کنیم:
Function showhello:integer;
Begin
ShowMessage('Hello!');
Result:= 0 ;
End;
ار دیگری که باید انجام دهیم این است که توابعی را که تعریف کرده ایم برای برنامه های اجرایی قابل دسترس سازیم تا برنامه ها و Dll های دیگر بتوانند از این توابع استفاده کنند . برای این کار از دستورs Export استفاده می کنیم بعد از این دستور لیست توابعی خواهد آمد که می خواهیم از خارج از Dll مورد استفاده قرار گیرند در صورتی که نعداد تابع ها بیشتر از یکی باشد بوسیله کاما آنها را از هم جدا می کنیم.
کد نویسی تمام شد حال یک Dll ساخته ایم . تنها کاری که باقی مانده است ذخیره Dll در مکان دلخواه و سپس کامپایل کردن آن است . از منو ی File گزینه Save As را انتخاب کنید و پس از انتخاب مکان دلخواه برای ذخیره ی پروژه ، در قسمت نام فایل برای پروژه نام مناسبی انتخاب کنید ما دراینجا eeuok را انتخاب کرده ایم .سپس دکمه ی Save را بزنید در پنجره کد عبارت Library eeuok به جای عبارت قبلی نشان داده می شود. برای کامپایل Dll از منوی Project گزینه Compile All project را انتخاب کنید.
مزیت دیگر Dll این است فایل Dll کامپایل شده می باشد و در نتیجه سورس آن در انحصار نویسنده آن خواهد بود و فقط فایل باینری آن توزیع می شود اما برنامه نویسان دیگر می توانند از Dll استفاده کنند اما جزییات پیاده سازی آن مخفی می ماند.
Dll ها به خودی خود نمی توانند اجرا شوند و بایستی توسط برنامه های اجرائی (کاربردی ) فراخوانی شوند.
بنابراین Dll روشی کارا برای :
1. استفاده مجدد از کد
2. همکاری بین افراد
3. و توزیع توابع نوشته شده توسط برنامه نویسان می باشد.
4. علاوه بر اینها بسیاری از توابع API دستورات مربوط به خود را فقط از طریق Dll انجام می دهند ( برای مبحث Wide Hook)
بنابراین هر برنامه نویس تحت سیستم عامل ویندوز لازم است تا نحوه نوشتن Dll را بداند . در این مقاله نحوه نوشتن Dll را توسط محیط برنامه نویسی Delphi 7 شرکت بورلند که یکی از بهترین و قوی ترین کامپایلر های موجود است را شرح می دهیم و در مقاله ای دیگر نحوه فرا خوانی Dll را که نوشته ایم توسط یک برنامه ساده نشان می دهیم . بدیهی است این مقاله فقط یک استارت و جرقه می باشد و تسلط کامل بر مبحث به عهده خواننده است.
اما نوشتن Dll:
محیط برنامه نویسی Delphi 7 را اجرا کنید و از منوی File گزینه NEW و سپس گزینه Other را انتخاب کنید .
سپس در پنجره ظاهر شده گزینه Dll Wizard را انتخاب کنید و دکمه Open را کلیک کنید.
پنجره Code Editor ظاهر می شود .
به اولین خط در این پنجره نگاه کنید . قبلا هنگام نوشتن برنامه های EXE اولین عبارت Program بود اما حالا اولین کلمه library است . Library به کامپایلر می گوید که کد، مربوط به یک پروژه Dll خواهد بود.
بعد از Library یک سری توضیحات با رنگ آبی نوشته شده است که یک یاد آوری برای برنامه نویس می باشد و هیچ ارزش اجرایی ندارد . اگر زحمتی بایتان ندارد خواندن آن برای یک بار هیچ ضرر مالی و جانی به همراه ندارد و بعدا می توانید آن را حذف کنید تا برنامه تان شلوغ نشود.
بعد از آن عبارت USES قرار گرفته است . همچنانکه برنامه نویسان محترم مستحضرید!!! این عبارت یونیت های به کار گرفته شده در برنامه را تعیین می کند . به صورت پیش فرض چند یونیت فرا خوانی شده اند اما بسته به کاری که Dll قرار است انجام دهد می توانید یونیت ها را اضافه و کم کنید .برای مثال در صورتی که یکی از توابع Dll قرار است که با رجیستری کار کند در این صورت به یونیت Registry احتیاج پیدا خواهید کرد و باید آن را در لیست Uses اضافه کنید.
بعد از آن یک راهنمای کامپایلر با رنگ سبز و سپس Begin ,End پروژه قرار دارد .
در Dll هر کاری که می خواهید انجام شود به صورت تابع بنویسید توابع را قبل از begin,End تعریف کنید.همانطور که قبلا گفتم Dll قدرت این را ندارد که به تنهایی اجرا شود و باید توسط یک برنامه کاربردی یا Dll دیگر فرا خوانی شود.
خوب حالا کد نویسی را شروع می کنیم . می خواهیم تابعی بنویسیم که با استفاده از یک message Box کلمه hello را نشان دهد. یادآوری می کنم که هدف ما آشنا کردن شما با ساختار یک Dll است .
[فقط کاربران عضو شده میتوانند این لینک را مشاهده کنند]
ون می خواهیم از Message Box استفاده کنیم و تابع ShopwMessge در یونیت dialogs است بنابراین این یونیت را به لیست Uses اضافه می کنیم.
قبل از Begin تابع را بدین صورت تعریف می کنیم:
Function showhello:integer;
Begin
ShowMessage('Hello!');
Result:= 0 ;
End;
ار دیگری که باید انجام دهیم این است که توابعی را که تعریف کرده ایم برای برنامه های اجرایی قابل دسترس سازیم تا برنامه ها و Dll های دیگر بتوانند از این توابع استفاده کنند . برای این کار از دستورs Export استفاده می کنیم بعد از این دستور لیست توابعی خواهد آمد که می خواهیم از خارج از Dll مورد استفاده قرار گیرند در صورتی که نعداد تابع ها بیشتر از یکی باشد بوسیله کاما آنها را از هم جدا می کنیم.
کد نویسی تمام شد حال یک Dll ساخته ایم . تنها کاری که باقی مانده است ذخیره Dll در مکان دلخواه و سپس کامپایل کردن آن است . از منو ی File گزینه Save As را انتخاب کنید و پس از انتخاب مکان دلخواه برای ذخیره ی پروژه ، در قسمت نام فایل برای پروژه نام مناسبی انتخاب کنید ما دراینجا eeuok را انتخاب کرده ایم .سپس دکمه ی Save را بزنید در پنجره کد عبارت Library eeuok به جای عبارت قبلی نشان داده می شود. برای کامپایل Dll از منوی Project گزینه Compile All project را انتخاب کنید.
نقل قول:library Project2;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
کد:
uses
SysUtils,
dialogs,
Classes;
{$R *.res}
Function showhello:integer;
Begin
ShowMessage('Hello!');
Result:= 0 ;
End;
exports showhello;
begin
end.