C++簡單外掛程式機制實現

來源:互聯網
上載者:User

  在我做的第一個頁遊項目中,伺服器使用了外掛程式的機制,但是當時的外掛程式都是用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是外掛程式的具體實現,可以理解為具體遊戲模組的實現。這裡實現的外掛程式機制是個雛形,只能用來示範功能,具體要用到遊戲伺服器中時外掛程式還需要訪問到主程式中的類,對象以及方法等。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.