پلاگین در واقع 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;
}