C++實現(xiàn)簡單插件機制原理解析
在我做的第一個頁游項目中,服務(wù)器使用了插件的機制,但是當時的插件都是用C#寫,而且如何實現(xiàn)的也不是很清楚。之后的幾個頁游項目都是自己一個人包攬服務(wù)器部分,所以一直沒有寫插件的需求。下一個頁游項目服務(wù)器這邊需要多人合作,因此我想把其他模塊都獨立的做成插件的模式,目前也是在探索階段。通過網(wǎng)上資料查找以及自己的整理,實現(xiàn)了一個簡單版本的插件機制。實現(xiàn)代碼如下:
文件Object.hpp中實現(xiàn)了所有插件類的基類,所有插件都要繼承該類。
#ifndef __OBJECT_HPP__
#define __OBJECT_HPP__
class Object
{
public:
Object() {}
virtual ~Object() {}
virtual int Dump() = 0;
};
#endif //__OBJECT_HPP__
文件TestObject.hpp以及TestObject.cpp是插件的實現(xiàn)類。
#ifndef __TESTOBJECT_HPP__
#define __TESTOBJECT_HPP__
#include "Object.hpp"
class TestObject : public Object
{
public:
virtual int Dump();
};
#endif //__TESTOBJECT_HPP__
#include "TestObject.hpp"
#include <iostream>
extern "C"
{
void *Instance()
{
return new TestObject;
}
}
int TestObject::Dump()
{
std::cout << "class name:TestObject function name:Dump()" << std::endl;
return 0;
}
文件main.cpp中加載和使用了插件,如果更深入一點的話這里可以寫一個插件管理的類,專門負責(zé)插件的注冊、對象的生成等工作。目前只為了演示功能故未做進一步研究。
#include <dlfcn.h>
#include <iostream>
#include "Object.hpp"
typedef Object *Instance();
int main()
{
void *handle = dlopen("./libto.so", RTLD_LAZY);
if(!handle)
{
std::cout << dlerror() << std::endl;
return 1;
}
Instance *GetInstance = (Instance *)dlsym(handle, "Instance");
if(!GetInstance)
{
std::cout << "Error Instance function" << std::endl;
return 1;
}
Object *obj = GetInstance();
if(0 != obj)
{
obj->Dump();
}
delete obj;
dlclose(handle);
return 0;
}
最后是makefile文件。
SOURCE=TestObject.cpp
makeso:${SOURCE}
g++ -fPIC -shared $^ -o libto.so
main:
g++ -o main -ldl main.cpp
clean:
rm -rf main *.o *.so
all:makeso main
程序的編譯方式很簡單,只要make all就可以了。運行過程如下:
[kiven@localhost plugin]$ make all g++ -fPIC -shared TestObject.cpp -o libto.so g++ -o main -ldl main.cpp [kiven@localhost plugin]$ ./main class name:TestObject function name:Dump() [kiven@localhost plugin]$
整個程序都很簡單,其中Object.hpp main.cpp兩個文件是主程序,即游戲服務(wù)器的框架中要實現(xiàn)的功能。TestObject.hpp、TestObject.cpp是插件的具體實現(xiàn),可以理解為具體游戲模塊的實現(xiàn)。這里實現(xiàn)的插件機制是個雛形,只能用來演示功能,具體要用到游戲服務(wù)器中時插件還需要訪問到主程序中的類,對象以及方法等。
到此這篇關(guān)于C++實現(xiàn)簡單插件機制原理解析的文章就介紹到這了,更多相關(guān)c++插件機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)好C++必須做到的50條 絕對經(jīng)典!
學(xué)好C++必須做到的50條,絕對經(jīng)典!想要學(xué)好C++的朋友一定要認真閱讀本文,更要做到以下50條2016-09-09
C++使用fdk-aac實現(xiàn)將音頻PCM編碼成aac
mp4的音頻流通常是aac編碼,我們做音視頻采集的時候就需要將,采集的音頻PCM編碼成aac,本文就來為大家介紹一下C++如何使用fdk-aac實現(xiàn)將音頻PCM編碼成aac吧2023-11-11
C語言項目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考
今天小編就為大家分享一篇關(guān)于C語言項目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02

