在我做的第一個頁遊項目中,伺服器使用了外掛程式的機制,但是當時的外掛程式都是用C#寫,而且如何?的也不是很清楚。之後的幾個頁遊項目都是自己一個人包攬伺服器部分,所以一直沒有寫外掛程式的需求。下一個頁遊專案服務器這邊需要多人合作,因此我想把其他模組都獨立的做成外掛程式的模式,目前也是在探索階段。通過網上資料尋找以及自己的整理,實現了一個簡單版本的外掛程式機制。實現代碼如下:
檔案Object.hpp中實現了所有外掛程式類的基類,所有外掛程式都要繼承該類。
1 #ifndef __OBJECT_HPP__ 2 #define __OBJECT_HPP__ 3 4 class Object 5 { 6 public: 7 Object() {} 8 virtual ~Object() {} 9 virtual int Dump() = 0;10 };11 12 #endif //__OBJECT_HPP__
檔案TestObject.hpp以及TestObject.cpp是外掛程式的實作類別。
1 #ifndef __TESTOBJECT_HPP__ 2 #define __TESTOBJECT_HPP__ 3 4 #include "Object.hpp" 5 6 class TestObject : public Object 7 { 8 public: 9 virtual int Dump();10 };11 12 #endif //__TESTOBJECT_HPP__
1 #include "TestObject.hpp" 2 #include <iostream> 3 4 extern "C" 5 { 6 void *Instance() 7 { 8 return new TestObject; 9 }10 }11 12 int TestObject::Dump()13 {14 std::cout << "class name:TestObject function name:Dump()" << std::endl;15 return 0;16 }
檔案main.cpp中載入和使用了外掛程式,如果更深入一點的話這裡可以寫一個外掛程式管理的類,專門負責外掛程式的註冊、對象的產生等工作。目前只為了示範功能故未做進一步研究。
1 #include <dlfcn.h> 2 #include <iostream> 3 #include "Object.hpp" 4 5 typedef Object *Instance(); 6 7 int main() 8 { 9 void *handle = dlopen("./libto.so", RTLD_LAZY);10 if(!handle)11 {12 std::cout << dlerror() << std::endl;13 return 1;14 }15 16 Instance *GetInstance = (Instance *)dlsym(handle, "Instance");17 if(!GetInstance)18 {19 std::cout << "Error Instance function" << std::endl;20 return 1;21 }22 23 Object *obj = GetInstance();24 if(0 != obj)25 {26 obj->Dump();27 }28 29 delete obj;30 dlclose(handle);31 32 return 0;33 }
最後是makefile檔案。
1 SOURCE=TestObject.cpp 2 makeso:${SOURCE} 3 g++ -fPIC -shared $^ -o libto.so 4 5 main: 6 g++ -o main -ldl main.cpp 7 8 clean: 9 rm -rf main *.o *.so10 11 all:makeso main
程式的編譯方式很簡單,只要make all就可以了。運行過程如下:
1 [kiven@localhost plugin]$ make all2 g++ -fPIC -shared TestObject.cpp -o libto.so3 g++ -o main -ldl main.cpp4 [kiven@localhost plugin]$ ./main5 class name:TestObject function name:Dump()6 [kiven@localhost plugin]$
整個程式都很簡單,其中Object.hpp main.cpp兩個檔案是主程式,即遊戲伺服器的架構中要實現的功能。TestObject.hpp、TestObject.cpp是外掛程式的具體實現,可以理解為具體遊戲模組的實現。這裡實現的外掛程式機制是個雛形,只能用來示範功能,具體要用到遊戲伺服器中時外掛程式還需要訪問到主程式中的類,對象以及方法等。