服务器之家

服务器之家 > 正文

C++实现简单插件机制原理解析

时间:2021-10-22 12:01     来源/作者:kiven.li

  在我做的第一个页游项目中,服务器使用了插件的机制,但是当时的插件都是用C#写,而且如何实现的也不是很清楚。之后的几个页游项目都是自己一个人包揽服务器部分,所以一直没有写插件的需求。下一个页游项目服务器这边需要多人合作,因此我想把其他模块都独立的做成插件的模式,目前也是在探索阶段。通过网上资料查找以及自己的整理,实现了一个简单版本的插件机制。实现代码如下:

  文件Object.hpp中实现了所有插件类的基类,所有插件都要继承该类。

?
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef    __OBJECT_HPP__
#define    __OBJECT_HPP__
 
class Object
{
public:
  Object() {}
  virtual ~Object() {}
  virtual int Dump() = 0;
};
 
#endif    //__OBJECT_HPP__

  文件TestObject.hpp以及TestObject.cpp是插件的实现类。

?
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef    __TESTOBJECT_HPP__
#define    __TESTOBJECT_HPP__
 
#include  "Object.hpp"
 
class TestObject : public Object
{
public:
  virtual int Dump();
};
 
#endif    //__TESTOBJECT_HPP__
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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中加载和使用了插件,如果更深入一点的话这里可以写一个插件管理的类,专门负责插件的注册、对象的生成等工作。目前只为了演示功能故未做进一步研究。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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文件。

?
1
2
3
4
5
6
7
8
9
10
11
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就可以了。运行过程如下:

?
1
2
3
4
5
6
[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两个文件是主程序,即游戏服务器的框架中要实现的功能。TestObject.hpp、TestObject.cpp是插件的具体实现,可以理解为具体游戏模块的实现。这里实现的插件机制是个雏形,只能用来演示功能,具体要用到游戏服务器中时插件还需要访问到主程序中的类,对象以及方法等。

到此这篇关于C++实现简单插件机制原理解析的文章就介绍到这了,更多相关c++插件机制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/kiven-code/archive/2013/02/28/2936811.html

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部