نمایش نتایج 1 تا 11 از 11

نام تاپیک: DLL های کاملا شی گرا

  1. #1

    Tick DLL های کاملا شی گرا

    سلام

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

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

    ممنون

  2. #2
    به جای تابع ها یک کلاس بنویسید و کلاس را 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...
    };

  3. #3
    در حالت run-time جواب میده؟

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

  4. #4
    چرا هنگام اجرا ؟
    این کار کاربران را سخت می کند

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

  5. #5
    در هر صورت ، اگر واقعا می خواهید link در حال اجرا داشته باشید ، شما می توانید به جای export کلاس ، تک تک توابع / متد ها را export کنید به همان شکل قبلی با ذکر MYDLL_EXPORTS قبل از اعلان تابع.

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

    ممنون

  7. #7
    در ضمن ، استفاده از export برای متدهای غیر مجاز است !

  8. #8
    نقل قول نوشته شده توسط BitMap مشاهده تاپیک
    من 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/art...article928.asp

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

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

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


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


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

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

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

  10. #10
    منابعی که دادید برای لینک زمان کامپایل است
    اگر plug-in شما یک dll هست برای استفاده از آن و load آن در هنگام اجرای برنامه ، باید از LoadLibrary و GetProcAddress استفاده کنید و این موارد هیچ لزومی به استفاده از توابع global ندارند ، می توانند در داخل و در حوزه یک کلاس تعریف شوند !

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

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

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

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

  11. #11
    از کمک تون ممنون
    من مطالب رو با دقت مطالعه می کنم و همان لینک دوم شما دارای دو تابع به نام های FreeMyInterface و GetMyInterface است که توابع غیر عضو هستند ، برای همین جواب من نبود.چون این نوع پیاده سازی رو بلد هستم و چیزی که می خواستم غیر این بود.
    سوال من هم اصلا عجیب نبود.نمی دونم برای چی این فکر رو کردید!

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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •