Parsi Coders

نسخه‌ی کامل: نحوه نوشتن dll در دلفی 7
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
مخفف 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 را انتخاب کنید.

نقل قول: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.
در پست قبلی یاد گرفتیم که چگونه یک dll بنویسیم .dll ای با یک تابع بانام Showhello نوشتیم که یک messageBox با کلمه hello را نشان داد. در این مقاله نحوه استفاده از این dll را در برنامه یاد می گیریم .
استفاده از توابع نوشته شده در dll ، به وسیله برنامه خود را فرا خوانی dll می گویند . همانند تابع که دارای دو step تعریف و فرا خوانی است dll هم دو جنبه تعریف و فراخوانی دارد تعریف dll مقاله قبلی بود و مبحث این مقاله استفاده از تابع قبلی است که همان جنبه فرا خوانی است .

به دوصورت می توان یک dll را از برنامه فرا خوانی کرد :
1 – فرا خوانی به صورت استاتیک
2 - فرا خوانی به صورت پویا یادینامیک

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

ابتدا فرا خوانی استاتیک را بررسی می کنیم .
Delphi 7 را اجرا کنید و پروژه جدیدتان را با نام دلخواه در مکان دلخواه ذخیره کنید.سپس یک کپی از dll ای را که قبلا ساختید را در پوشه ای که پروژه تان را ذخیره کردید قرار دهید. البته می توانید dll را در پوشه ی ویندوز یا در پوشه ی system32 نیز قرار دهید این یک مسیر پیش فرض برای سیستم عامل است تا فایل ها ی اجرایی را در آنجا جستجو کند.
در پنجره کد ادیتور بعد از uses و قبل از type هدر تابعی را که در dll تعریف کرده اید .

برای مثال ما خط زیر را قرار دهید:

function showhello:integer ; stdcall; external 'eeuok.dll';

به دو کلمه stdcall و external در تعریف هدر توجه کنید ، stdcall نوع انتقال آرگومان ها را به تابع معین می کند . چند نوع روش انتقال وجود دارد stdcall پارامتر ها را از راست به چپ به تابع ارسال می کند بدون اینکه از رجیستر ها استفاده کند . به دلیل اینکه برنامه اجرایی و تابع فرا خوانی شونده جدا از هم می باشند نحوه ارسال پارامتر ها مهم

است .
External به کامپایلر می گوید که تابع باید از یک dll در حافظه قرار گیرد.در صورتی که dll را در مکانهایی که قبلا گفتم قرار نداده اید ذکر مسیر کامل dll بعد از external ضروری است .


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

ما این کار را در رویداد formcreate انجام دادیم:


procedure TForm1.FormCreate(Sender: TObject);
begin
showhello;
end;


سالک : روش دوم را در خود سایت بخوانید. روش اول چون خیلی ساده بود و باعث ایجاد تنوع میشد را نقل کردم. ما تابحال 3 نوع برنامه ایجاد کردیم. کنسولی - ویندوزی - و dll ئی . با مقایسه این 3 نوع برنامه و مشاهده تفاوها و شباهتها حالا بیشتر می دانید که هر کلمه معنای چیست. مثل کلمهlibrary (در پروژه dll ئی ) با program در برنامه ویندوزی در خط اول کد پروژه .
همچنین مثل usesکه در کنسولی چنین است:
uses
SysUtils;
و در نوع dll ئی داریم:
uses
SysUtils,
dialogs,
Classes;
البته dialogs را خودمان اضافه کردیم چون قرار بود dll ما مسیج باکس را نمایش دهد که جلوه ای دیالوگی بود.
و در پروژه ای که میانگین 10 عدد را محاسبه می کرد uses چنین بود:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;