ساخت پلاگین در c++ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

ساخت پلاگین در c++

+1 امتیاز
سلام . قصد دارم یک سری از کلاس ها رو توسعه بدم علت این توسعه در برخی موارد وابسته نبودن به کتابخانه ی هستش یعنی هر وقت کاربر اون کتابخانه را نیاز داشت لود بشه یکی هم آینده نگری هستش  در آینده قصد دارم  کلاس پایه را توسعه بدم ولی قصد ندارم پروژه دوباره دستکاری شه.
سوال شده خرداد 5, 1399  بوسیله ی COLD (امتیاز 200)   4 28 37

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

پلاگین در واقع export کردن یک کلاس با ساختار مشخص هستش در ضمن export پلاگین باید در حالت ansi c باشه شما اینطوری فرض کنید که یک کلاس abstract دارید و بعد کلاس هایی که در آینده قرار از آن مشتق شن رو به کاربر بدید هر کدام از این کلاس ها فرض کنید در قالب یه فایل کتابخانه ای باشه و همه پلاگین های مربوط به یک موضوع را در یک فلدر در کنار برنامه تون قرار بدید و در زمان لود هم داخل اون فلدر را پیمایش کنید هر چی کتابخانه داخل آن فلدر بود در واقع کلاس های جدید از اون کلاس abstract شما هستش. در ضمن پلاگین به صورت دینامیک لود میشه نه استاتیک .یعنی خودتون در حین اجرا لودش می کنید. خیلی ساده براتون مثال بزنم حداقل چیزهایی که باید تعریف کنید سازنده و مخرب هستش interface ها باید بین همه کلاس ها یکسان باشه

شماتیکش یک همچین چیزی میشه:


#include <iostream>

using namespace std;
//server side

//base library
class TestParent{
   public :
      virtual ~ TestParent(){}
      virtual void print()= 0;
};


//library  Plugin1
class CustomChild1 : public TestParent{
  public:
    virtual void print() override{
      cout << "CustomChild1" << endl;
    }
};

extern "C"{
    CustomChild1* createObject(){
        return new CustomChild1();
    }
    void freeObject(CustomChild1* obj){
        delete obj;
    }
}


//library Plugin2
class CustomChild2 : public TestParent{
  public:
    virtual void print() override{
      cout << "CustomChild2" << endl;
    }
};

extern "C"{
    CustomChild2* createObject(){
        return new CustomChild2();
    }
    void freeObject(CustomChild2* obj){
        delete obj;
    }
}

//client side

typedef TestParent* (_stdcall* CREATE_OBJECT)();
typedef void (_stdcall* FREE_OBJECT)(TestParent* item);

int main()
{
    //iterate plugin folder
   for (auto lib_name : plugin_folder)   {
        auto dll_instance_ = LoadLibraryA(lib_name .c_str());

        auto createObject = (CREATE_OBJECT)GetProcAddress(dll_instance_, "createObject ");
	auto freeObject = (FREE_OBJECT)GetProcAddress(dll_instance_, "freeObject ");

        
        TestParent* item = createObject();
        item->print();
        freeObject(item);
   }

    return 0;
}


 

پاسخ داده شده خرداد 8, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد خرداد 8, 1399 بوسیله ی COLD
چرا از "extern "C استفاده می‌کنید ؟ نیازی به لینکر C ندارید. از boost::dll استفاده کنید.
...