واضح آرشیو وب فارسی:سایت ریسک: View Full Version : کمک برای Dynamic Link Library mJo0T30-01-2007, 10:49 PMمی خواستم بدونم کسی می تونه در مورد ساخت فایل هلی dll توی ++ Visual C به من کمک کنه. واقعاً ممنون میشم :cool: someone31-01-2007, 02:37 PMسلام. اول یه توضیح خیلی مختصر (خیلی خیلی مختصر) در باره 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) سعی کردم خلاصه و مفید توضیح بدم. اگه جایی مشکل داشت یا براتون مشکلی پیش اومد اطلاع بدید. mJo0T31-01-2007, 06:58 PMاز اینکه کمکم کردی ممنونم سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 293]