ساخت و ویرایش یک فایل dll.

نام کاربری : پسورد : یا عضویت | رمز عبور را فراموش کردم



ارسال پاسخ
تعداد بازدید 1651
نویسنده پیام
admin آفلاین

مدیرکل
ارسال‌ها : 292
عضویت: 25 /1 /1393
محل زندگی: اصفهان
سن: 25
شناسه یاهو: NAVIDNAVID91
تشکرها : 20
تشکر شده : 156
ساخت و ویرایش یک فایل dll.
سلام به دوستان خوبم



مدتیه دنبال آموزش ساخت و ویرایش فایلهای dll هستم، قبلاً با استاد
شیرین زبان هم مطرح کردم که ایشون فرمودند بزودی در این مورد مطالبی خواهند
نوشت.



فعلاً یه سری آموزشهایی جمع آوری کردم که قرار دادم، امیدوارم برای علاقمندانش مفید باشه!







فایل DLL چیست ؟





یه توضیح کوچیک در مورد Dll ها و بعدشم روش ساختن DLL با #C .





فایل dll یک کتابخونه ازData و Code هست که می تونه در یک زمان توسط چندینApplication مورد استفاده قرار بگیره .

برای مثال در سیستم عامل Windows فایل Comdlg32.dll عملکرد های مربوط به Dialog Box ها رو انجام میده .

در نتیجه هر Application ی در ویندوز می تونه از توابعی که توی این dll هستند موقع باز کردن Dialog Box استفاده کنه .

مزیت اصلی فایل های dll در استفاده مجدد و همینطور استفاده بهتر از حافظه سیستم هست .





کاربرد dll در برنامه نویسی :

با استفاده از این فایل های dll میشه برنامه هارو به صورت کاملا Modular و با مولفه های قابل مدیریت نوشت .

برای مثال یه برنامه Accountig که به صورت Modular نوشته شده می تونه بسیار سریعتر از نمونه مشابه که Modular نوشته نشده اجرا بشه .





دلیلشم اینه که Module ها به صورت جدا از هم کار می کنند و هر Moduleی که
نصب شده باشه در زمان اجرا توی حافظه Load میشه و از یه Module فقط زمانی
استفاده میشه که به اون Module احتیاج باشه .





مزیت دیگه استفاده از Module اینه کهUpdate برنامه خیلی راحت تر انجام میشه
و فقط Module مورد نظر Update میشه بدون اثر گذاشتن روی سایر Module ها .





فایل های زیر در سیستم عامل Windows به عنوان DLL مورد استفاده قرار می گیرند .





ActiveX Controls (.ocx) files

مثل کنترل Calendar در ویندوز .





Control Panel (.cpl) files

مثل همه Item های موجود در کنترل پنل Windows





Device Driver Controls (.drv) files

مثل یک فایل Driver برای یک Printer ...





خوشبختانه خودWindows مجموعه کاملی از DLL ها رو در اختیار برنامه نویس قرار میده .





در نتیجه خیلی به ندرت پیش میاد که بخوایم DLL های مورد نیازمون رو خودمون بنویسیم ...





این کار بیشتر توی پروژه های Game Programing انجام میشه .

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





واقعا کار پیچیده ایه ...

ولی برای آشنایی هم که شده ساختن DLL با VStudio خیلی کوتاه مرور می کنیم .





ساختن DLL با VStudio:





به دو روش میشه یه پروژه DLL رو ایجاد کرد :





1- از طریق Class Library



2- از طریق Windows Forms Control Library





ما فقط روی روش اول تمرکز می کنیم .





در روش اول :





1- از منوی File گزینه New Project رو انتخاب کنید .





2- در کادر Project Type گزینه Visual C#.Net رو انتخاب کنید .





3- بعدش توی کادر Template گزینه Class Library رو انتخاب کنید .





4- برای پروژه یک اسم و آدرس مشخص کنید .پنجره کد شامل Class1 باز میشود ...در این پنجره میشه کد DLL رو برنامه نویسی کرد .









در قسمت قبلی رسیدیم به پنجره Class1.cs ...





1- توی پنجره Class1.cs این قطعه کد رو بنویسید .





کد:

// Interface declaration







public interface ICalculator

}





;( int Add (int Number1 , int Number2

{



2- این قطعه رو هم اضافه کنید :





کد:

public class ManagedClass:ICalculator

{

public int Add(int Number1,int Number2)

{

return Number1 Number2;

{





{


این قطعه برنامه خیلی ساده دو عدد رو با هم جمع می کنه .




3- Vstudio Command Promt رو اجرا کنید .





حالا باید برای Class Library که در مرحله قبل طراحی شد یه اسم تعیین کنید .





4- این دستور رو در Command Promt تایپ کنید :





sn.exe -k MyKeyFile.SNK





بعدش فایل MyKeyFile.SNK رو در فولدر پروژه کپی کنید .





5- روی فایلAssemblyInfo.cs دابل کلیک کنید تا در پنجره Solution Explorer باز بشه .

کد های زیر رو :

کد:

[assembly: ComVisible(false)]

[assembly: AssemblyDelaySign(false)]

[assembly: AssemblyKeyFile(\"\")]

با این کدها جایگزین کنید :

کد:

[assembly: ComVisible(true)]

[assembly: AssemblyDelaySign(false)]

[assembly: AssemblyKeyFile(\"..\\\\..\\\\MyKeyFile.SNK\" )]




در آخر کلید هایCtrl Shift B رو بزنید تا فایل DLL تولید شود.




تمام ...





خب دیدین که Generate کردن DLL برای یه تابع خیلی ساده هم , کار خیلی پیچیده ایه.





تازه اونم به مدد MSDN

و گرنه ساختن یه کتابخونه کامل خیلی سخت تر از این حرفاست .





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





* * * * * * * * *





Dll مخفف 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:




محیط برنامه نویسی 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 ، به وسیله برنامه خود را فرا خوانی 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;







ساخت یک dll با ویژوال سی 6 برای استفاده در ویژوال بیسیک 6:





ابتدا از منوی فایل گزینه new را بزنید و بعد در پنجره باز شده در تب
Projects گزینه Win32 Dynamic-Link Library را بزنید. بعد نامی به پروژه
بدهید و مکانش را در هارد مشخص کنید.



در پنجره بعدی گزینه An empty DLL project را انتخاب کنید.



بعد بایستی فایلی به پروژه بیافزایید.



از منوی فایل باز new را بزنید و بعد در تب Files گزینه C Source File را انتخاب و نام SampleCode بدهید.





بعد مراحل بالا را باز برای افزودن فایل دیگری بروید ولی این بار C/C
Header File را انتخاب کنید. نام فایل را همنام فایل قبلی بدهید.





برای اضافه کردن فایل بعدی مراحل قبل را تکرار کنید ولی این بار گزینه text file را انتخاب کنید و نام exports.def را به آن بدهید.







اضافه کردن کدها:

به فایل SampleCode.h کد زیر را اضافه کنید:

کد:

#include

int nFirstNum;

int nSecondNum;

به فایل SampleCode.cpp کد زیر را اضافه کنید:






کد:

#include \"SampleCode.h\"



//This Function will accept a String And two integers

//It will display the String in a message box, And Return

//the sum of the two integers

//This Is intended As a sample of passing info between

//c And visual basic



// Function definition

int __stdcall MyFunction(char *szString, int nFirstNum, int nSecondNum)

{

//Display a messagebox With the String (just wanted To show you

//how To pass a String)

MessageBox(NULL,szString,\"Sample Code\", NULL);



//Return the sum of the two integers. Notice a vBulletin Long Is an Integer

//in c .

return nFirstNum nSecondNum;

}

به فایل exports.def کد زیر را اضافه کنید:

کد:

EXPORTS

MyFunction @1

کد:

Additional export functions would be @2, @3, ...






Build the dll

دکمه F7 را بزنید یا از منوها :

Build > Build SampleProj.dll

بعد این کار در پنجره بیلد باید داشته باشید:

0 errors and 0 warnings

یعنی بی خطا اجرا شود.

حالا در جایی که پروژه را ذخیره کرده اید در پوشه debug فایل dll خود را دارید.

ایجاد نسخه نهایی یا release

از منوی Build گزینه Set Active Configurations را بزنید. پنجره ای باز می شود. Release را انتخاب کنید و ok کنید.

دوباره پروژه را Build کنید.

این بار در مکان ذخیره پروژه یک پوشه جدید به نام Release ایجاد می شود که
باز حاوی فایل dll شماست. که قابل استفاده برای ویژوال بیسیک است.





استفاده در ویژوال بیسیک 6:





یک پروژه وی بی استاندارد باز کنید.

کد زیر را به پنجره کد بیافزایید:

کد:

Option Explicit



\'Declare the c dll. In the real world you will probably do this

\'in a module. Note the path to your dll might be different than mine.

\'Also note that the values are being passed ByVal

Private Declare Function MyFunction Lib _

\"c:\\pub\\sampleproj\\debug\\SampleProj.dll\" (ByVal szString As String, _

ByVal nFirstNum As Long, ByVal nSecondNum As Long) As Long



Private Sub Form_Load()

Dim lngResults As Long

\'call the function. It should display a messagebox with the string

\'which will originate from the dll, and then another messagebox

\'from vBulletin with the total of our two longs

lngResults = MyFunction(\"This is a test.\", 5, 4)

MsgBox \"The total is \" & CStr(lngResults)

Unload Me

End Sub



آدرس فایل dll (قسمت قرمز) را مطابق مسیر فایل و نام فایل بکنید. پروژه وی بی را اجرا کنید.









* * * * * * *


امضای کاربر : تا می توانی دلی بدست آور
                                            دل شکستن هنر نمی باشد
دوشنبه 01 اردیبهشت 1393 - 00:16
نقل قول این ارسال در پاسخ گزارش این ارسال به یک مدیر
ارسال پاسخ



برای ارسال پاسخ ابتدا باید لوگین یا ثبت نام کنید.


پرش به انجمن :

Powered by Tem98 | Copyright © 2009 Rozblog Group