مشاهده نسخه کامل
: کمک برای Dynamic Link Library
می خواستم بدونم کسی می تونه در مورد ساخت فایل هلی dll توی ++ Visual C به من کمک کنه.
واقعاً ممنون میشم
:cool:
سلام.
اول یه توضیح خیلی مختصر (خیلی خیلی مختصر) در باره Dll ها :
Dll یا Dynamic-link Library کتابخانه ای هست با یک سری تابع یا کلاس بطوری که برنامه های دیگه میتونن
از این توابع یا کلاس ها استفاده کنن.Dll ها مزیت های زیادی دارن. از جمله اینکه حجم برنامه ها رو زیاد نمیکنن چون
با برنامه ی مورد نظر link نمیشن. چند برنامه همزمان میتونن به یک Dll دسترسی داشته باشن که
نکته ی خیلی مهمی هست. ودلایل دیگه. توابع ارسالی در جدولی داخل Dll قرار میکیرند و به توابعی که در این
جدول موجود باشن میشه دسترسی پیدا کرد. یک Dll نمیتونه public Variable داشته باشه و در ضمن تمامی متغییر
ها باید بصورت آرگومان به Dll ارسال بشن.
برای دسترسی و استفاده از توابع یک Dll دو روش وجود داره :
1- باید با ساختار تابع مورد نظر در Dll آشنا باشید.مثلا بدونید که تابع چند آرگومان داره یا چه نوعی رو برمیگردونه.
بعد یک اشاره گر به تابع مورد نظر ایجاد میکنیم. با استفاده از LoadLibrary و GetProcAddress تابع مورد نظر رو بیرون
می کشیم. روش نسبتا مشکلی هست. و اشکالات رو خودمون باید handle کنیم. اما برای استفاده از خیلی Dll ها
(به خصوص در Windows برای استفاده از بعضی API ها) تنها روش همین هست. اگه Dll رو خودتون ننوشته باشید
پیدا کردن مشخصات یک تابع با اسمی که تنها شما حدس میزنید خیلی مشکل هست.که باید Dll مورد نظر رو Dump
کرد.
2- روش دوم که روش ساده تری هست Link کردن فایل Lib به برنامه هست.وقتی یک Dll ایجاد میکنید همراهش یک
فایل Lib هم ایجاد میشه. این فایل Lib اسامی توابع و آرگومان های اونها رو به همراه داره البته بدون تعریفشون.
(prototype) بنابراین وقتی به برنامه لینک بشه به راحتی میشه از توابع درون Dll استفاده کرد. در ضمن اگه مشکلی هم
برای Dll مورد نظر پیش بیاد , برنامه به شما اخطار میده.
بین این دو روش روش اول کاربرد بیشتری داره. چون بیشتر Dll ها بدون فایل Lib منتشر میشن.
در VC به طور کلی میتونید 3 نوع DLL ایجاد کنید : (به غیر از در نظر گرفتن ActiveX ها)
که دو نوعش با استفاده از MFC AppWizard ایجاد میشه با نام های Regular Dll و MFC Dll .
نوع سوم هم Win 32 Dynamic-Link library هست.
هنگامی که از MFC Dll استفاده میکنید به راحتی میتونید از تمامی کلاس های MFC استفاده کنید و حتی اونها رو Export کنید.
اما این Dll ها ضعف بزرگی دارند و اون هم اینه که تنها در زبان هایی که از MFC پشتیبانی میکنن میشه ازشون استفاده کرد.
البته در مورد Regular Dll مقداری قضیه فرق میکنه. با اینکه میشه در اون از کلاس های MFC استفاده کرد با تغییراتی میشه اون
رو به صورت یک Dll استاندارد در آورد.برای این کار کافی از ساختار Windows به جای کلاس ها استفاده بشه.
نوع سوم هم مشخصه که با اون میشه یک Dll استاندارد تحت Win32 ایجاد کرد.
در اینجا در مورد Win32 Dll بحث می کنیم :
برای ایجاد یک Win32 Dll به این صورت عمل میکنیم :
از منوی فایل گزینه new و از dialog باز شده گزینه Win32 Dynamic-Link library رو انتخاب و اسمی برای پروژه انتخاب میکنیم
و در پنجره ی بعدی که بعد از OK کردن باز میشه, گزینه ی An empty Dll Project رو انتخاب میکینم و روی Finish کلیک میکنیم.
حالا دوباره از منوی فایل این بار از Files tab گزینه C++ source file رو اتخاب و براش اسمی در نظر میگیریم.
این مرحله رو یک بار دیگه هم تکرار می کنیم و این بار C++ Header file رو انتخاب میکنیم .اسمی که من برای این دو فایل
در نظر گرفتم main هست.
در workspace (منوی سمت چپ) اگه روی File view کلیک کنید در قسمت Source file و Header file میتونید فایل های
ایجاد شده رو ببینید. روی فایل main.h دوبار کلیک کنید تا باز بشه و کد زیر رو بهش اضافه کنید :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قرار هست ما در این Dll تابعی به نام Sum ایجاد کنیم که دو عدد رو باهم جمه میکنه. پیش از تعریف تابع از ماکروی با
نام DLL_API استفاده کردیم. استفاده از ماکرو برای Export تابع مورد نظر لازم هست. اگه از Def file استفاده کنیم
نیازی به استفاده از این ماکرو نیست. ولی در صورت استفاده کار راحت تر میشه.
روی main.cpp دوبار کلیک کنین تا باز شه و کد زیر رو در اون قرار بدید :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Entry-point یک Dll تابعی هست با اسم DllMain که سه آرگومان داره. توضیح کار هر کدوم از آرگومان ها خیلی مفصله.
اگه خواستید در موردش صحبت میکینم. بعد از DllMain تابع مورد نظر مون رو مینویسیم. میبینید که کار چقدر راحت هست.
در پایان هم برنامه رو Execute میکینم.بعد از Excute کردن پنجره باز میشه که از شما میخواد که Dll رو به برنامه ایAttach کنید.
این پنجره رو ببندید.
خب برای استفاده از Dll ی که ساختیم یک پروژه جدید از نوع MFC App ایجاد کنید. (Dialog base)
من پروژه ای با نام _Test ایجاد کردم. در فایل _TestDlg.Cpp این کد رو اضافه میکنیم. البته بعد تعریف header ها :
فایل Dll و Lib از پوشه debug به پروژه ی جدید منتقل کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
به جای استفاده از pragma# میتونید مستقیما فایل Lib مورد نظر رو به برنامه Link کنید.
(از طریق Add to project در منوی project) .
براحتی میشه از تابع Sum استفاده کرد :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
متوجه شدید که از روش دوم برای invoke کردن تابع Sum استفاده کردیم. (استفاده از فایل Lib)
سعی کردم خلاصه و مفید توضیح بدم. اگه جایی مشکل داشت یا براتون مشکلی پیش اومد اطلاع بدید.
از اینکه کمکم کردی ممنونم
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.