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

 更新时间:2021年02月19日 09:28:44   作者:kiven.li  
这篇文章主要介绍了C++实现简单插件机制原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

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

#ifndef    __OBJECT_HPP__
#define    __OBJECT_HPP__

class Object
{
public:
  Object() {}
  virtual ~Object() {}
  virtual int Dump() = 0;
};

#endif    //__OBJECT_HPP__

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

#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中加载和使用了插件,如果更深入一点的话这里可以写一个插件管理的类,专门负责插件的注册、对象的生成等工作。目前只为了演示功能故未做进一步研究。

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

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

相关文章

  • c语言快速排序算法示例代码分享

    c语言快速排序算法示例代码分享

    快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)
    2014-02-02
  • 超级详细讲解C++中的多态

    超级详细讲解C++中的多态

    多态是在不同继承关系的类对象,去调同一函数,产生了不同的行为,下面这篇文章主要给大家介绍了关于C++中多态的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • C++ Boost Accumulators累加器详细讲解

    C++ Boost Accumulators累加器详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 基于C++实现BMI身体质量指数计算工具

    基于C++实现BMI身体质量指数计算工具

    BMI(Body Mass Index,身体质量指数),也称为体重指数,是一种常用的衡量成人人体肥胖程度的指标,本文就来用C++编写一个简单的BMI计算工具吧
    2023-10-10
  • c++制作的时间函数类

    c++制作的时间函数类

    本文给大家分享的是一个个人使用C++编写的时间函数类,主要是实现了类的定义和调用,相比较来说还算比较复杂的时间类了,推荐给小伙伴们,有需要的朋友可以参考下。
    2015-03-03
  • C语言手把手教你实现贪吃蛇AI(上)

    C语言手把手教你实现贪吃蛇AI(上)

    这篇文章主要介绍了C语言手把手教你实现贪吃蛇AI,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言代码实现扫雷小游戏

    C语言代码实现扫雷小游戏

    这篇文章主要为大家详细介绍了C语言代码实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言实现无头单向链表的示例代码

    C语言实现无头单向链表的示例代码

    本文主要介绍了C语言实现无头单向链表的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C语言SetConsoleTextAttribute函数使用方法

    C语言SetConsoleTextAttribute函数使用方法

    这篇文章介绍了C语言SetConsoleTextAttribute函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 浅谈C语言转义字符和格式控制符

    浅谈C语言转义字符和格式控制符

    下面小编就为大家带来一篇浅谈C语言转义字符和格式控制符。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论