PDA

View Full Version : DLL های کاملا شی گرا



BitMap
جمعه 03 اسفند 1386, 08:19 صبح
سلام

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

استفاده از COM و توابع LoadLibrary هم نیاز به استفاده از توابع global داره

ممنون

Nima_NF
جمعه 03 اسفند 1386, 16:11 عصر
به جای تابع ها یک کلاس بنویسید و کلاس را export کنید:



#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

class MYDLL_API MyCLASS
{

public:
MyCLASS(void);

// your methods here...
};

BitMap
جمعه 03 اسفند 1386, 22:35 عصر
در حالت run-time جواب میده؟

اینجوری باید هنگام کامپایل dll رو داشته باشم
می خواهم هنگام اجرا dll رو بار کنم.
مثل plugin ها
یک پیاده سازی برای استفاده از plugin می خواهم.

Nima_NF
شنبه 04 اسفند 1386, 00:20 صبح
چرا هنگام اجرا ؟
این کار کاربران را سخت می کند

تقریبا تمامی plug-in ها در هنگام کامپایل این کار را می کنند ، یعنی شما هدر فایل خود را به همراه فایل dll به افراد می دهید و آن ها برای ساخت plug-in از آن استفاده می کنند و به این کار می گویند انتشار SDK برای نرم افزار خود.

Nima_NF
شنبه 04 اسفند 1386, 01:10 صبح
در هر صورت ، اگر واقعا می خواهید link در حال اجرا داشته باشید ، شما می توانید به جای export کلاس ، تک تک توابع / متد ها را export کنید به همان شکل قبلی با ذکر MYDLL_EXPORTS قبل از اعلان تابع.

BitMap
شنبه 04 اسفند 1386, 22:03 عصر
نیما جان:
من plugin نمی نویسم.خودم برنامه ای نوشته ام که از plgin پشتیبانی می کنه.حالا برای اینکه plugin های این نرم افزار رو اجرا کنم باید یک تابع رو به عنوان نقطه ی شروع dll اجرا کنم.یه چیزی مثل main . حالا من می خواهم اون تابع یک متد ( تابع عضو) باشه چون می خواهم plugin های نرم افزار هم شی گرا باشند.
اگر با اون روش شما حل میشه ، خیلی ممنون میشم توضح کامل تر یا یک منبع معرفی کنی

ممنون

BitMap
شنبه 04 اسفند 1386, 22:05 عصر
در ضمن ، استفاده از export برای متدهای غیر مجاز است !

Nima_NF
شنبه 04 اسفند 1386, 22:31 عصر
من plugin نمی نویسم.خودم برنامه ای نوشته ام که از plgin پشتیبانی می کنه.حالا برای اینکه plugin های این نرم افزار رو اجرا کنم باید یک تابع رو به عنوان نقطه ی شروع dll اجرا کنم.

بله ، اما من اگر بخواهم برنامه ای بنویسم که قابلیت پشتیبانی از plug-in داشته باشد ، SDK نرم افزار خود را در اختیار افراد قرار می دهم تا با آن plug-in برای نرم افزارم بنویسند که شئی گرا هم می تواند باشد (مانند تمامی نرم افزار های تجاری موجود که از plug-in پشتیانی می کنند)
روش کار هم در این شیوه همان export کامل کلاس ها می باشد که ذکر کردم و سپس افرادی که می خواهند plug-in بسازند هنگام کامپایل dll را لینک می کنند یا به قولی از همان SDK شما استفاده می کنند.(این روش مرسوم برنامه نویسی با قابلیت پشتیبانی از Plug-in می باشد) مثل نرم افزارهای photoshop ، Winamp , ...

در هر حال اگر واقعا مجبورید که از حالت run-time استفاده کنید ، هم کار برای شما سخت می شود هم برای plug-in نویسان.
وقتی از کلاس استفاده می شود ، runtime linking به همین راحتی پشتیبانی نمی شود و شما چند راه دارید:

1) استفاده از COM که مشکل است
2) روش Interface که به نوعی شبیه سازی سبک COM برای کلاس هاست که runtime linking را پشتیبانی می کند.

برای روش دوم آخرین پاراگراف و آخرین نمونه کد ها را در مقاله زیر مشاهده کنید:
http://www.gamedev.net/reference/articles/article928.asp


در ضمن ، استفاده از export برای متدهای غیر مجاز است !
برای اطلاعات بیشتر در این مورد این لینک را مشاهده کنید:
http://msdn2.microsoft.com/en-us/library/ms235636(VS.80).aspx (http://msdn2.microsoft.com/en-us/library/ms235636%28VS.80%29.aspx)

BitMap
یک شنبه 05 اسفند 1386, 06:08 صبح
از صبر و حوصله ی شما خیلی خیلی ممنون.
من یک کرنل دارم.این کرنل وقتی اجرا میشه توی پوشه ی پلاگین هاشو می گرده و پلاگین های موجود رو یکی یکی بار میکنه . هر وقت به یکی احتیاج داشه کنترل رو به نقطه ی شروع اون پلاگین میده.
حالا کرنل من باید با تمام پلاگینهاش کامپایل بشه !!!!!
استفاده از com هم مستلزم قرار داده یک تابع غیر عضو در کد هست که اشاره گری به شی مورد نظر رو بر میگردونه

مثلا من یک برنامه دارم به نام a
حالا یک پلاگین براش ساختن به نام b
برنامه ی من می خواهد پلاگین هاشو بار کنه
توی مسیری خاص می گرده و پلاگین b رو پیدا میکنه
پلاگین b این سورس کد رو داره:



class bplugin
{
public:
void show()
{
cout >> "hi";
}
};

حالا برنامه ی a می خواهد یک نمونه از کلاس bplugin رو ایجاد کنه و متد show از اون رو فراخوانی کنه.

امیدوارم منظورم رو رسونده باشم
ممنون

منابعی که دادید برای لینک زمان کامپایل است

Nima_NF
یک شنبه 05 اسفند 1386, 16:20 عصر
منابعی که دادید برای لینک زمان کامپایل استاگر plug-in شما یک dll هست برای استفاده از آن و load آن در هنگام اجرای برنامه ، باید از LoadLibrary و GetProcAddress استفاده کنید و این موارد هیچ لزومی به استفاده از توابع global ندارند ، می توانند در داخل و در حوزه یک کلاس تعریف شوند !

با توجه به گفته های شما ، اطلاعات سورس کد plug-in شما در قالب یک dll هست و یک فایل متنی نیست که به راحتی گفته شود آن ها را بخوان ، پس بدون استفاده از LoadLibrary چگونه می خواهید dll را load و استفاده کنید ؟

امیدوارم شما با دقت بیشتری مطالب را مطالعه کنید ، لینک ذکر شده (بخش دوم آن) نحوه RunTime Linking را با همین توابع و برای کلاس ها توضیح می دهد ، یعنی تولید و استفاده کلاس ها در یک dll
http://www.gamedev.net/reference/articles/article928.asp


استفاده از com هم مستلزم قرار داده یک تابع غیر عضو در کد هست که اشاره گری به شی مورد نظر رو بر میگردونهآیا شما می توانید یک برنامه شئی گرا بنویسید که مثلا تابع main که جزء کلاس نیست در آن وجود نداشته باشد ؟
همراه توابع و بخش هایی وجود دارد که خارج کلاس ها و یا حتی داخل یک dll شئی گرا وجود دارند که برای انجام کارها به ناچار باید خارج از حوزه کلاس نوشته شوند و راه فرار هم ندارند مثل (تابع ورودی dll ها با نام DllMain که همانند main برنامه اصلی است ).

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

BitMap
یک شنبه 05 اسفند 1386, 18:31 عصر
از کمک تون ممنون
من مطالب رو با دقت مطالعه می کنم و همان لینک دوم شما دارای دو تابع به نام های FreeMyInterface و GetMyInterface است که توابع غیر عضو هستند ، برای همین جواب من نبود.چون این نوع پیاده سازی رو بلد هستم و چیزی که می خواستم غیر این بود.
سوال من هم اصلا عجیب نبود.نمی دونم برای چی این فکر رو کردید!

به هر حال ممنون
جواب که من گرفتم اینه:
نمیشه