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++插件机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Ubuntu中使用VS Code与安装C/C++插件的教程详解

    优麒麟Ubuntu20.04中使用VS Code. VS Code的版本是1.48.0. 以下内容仅限于上述环境,对于Windows环境下的使用虽然类似,只能参考使用. 1.准备 a.软件安装 可以通过软件商店进行安装,也可以下载安装. 下载安装的官网地址:https://code.visualstudio.com/. 可以下载deb和rpm两种格式的安装软件. b.目录计划 编写程序过程中,需要事先决定编写的程序放在哪里,这就需要做一个目录计划.任何一个软件项目也都需要做目录规划,以便所写的程

  • vscode使用官方C/C++插件无法进行代码格式化问题

    官方的C/C++插件是支持使用.clang-format配置文件进行自定义风格代码格式化的,无需另外安装clang-format插件. 但是使用clang-format -style=llvm -dump-config > .clang-format导出的默认配置文件进行格式化的时候会有一些小问题.如图 根据输出窗口的提示,是第94行出现了无法识别的key: 将.clang-format中第93~96行的代码加上注释就解决了: 至于为啥,笔者估计是官方插件还不支持RawStringFormats

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

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

  • C++插件化 NDD源码的插件机制实现解析

    目录 NDD介绍 插件的优势 NDD插件机制分析 插件接口 插件实现 NDD插件加载过程 插件机制是一种框架,允许开发人员简单地在应用程序中添加或扩展功能.它使广泛使用,因为它可以作为模块被重复使用,并使它们更易于维护和扩展,因此它们在应用程序中非常有用.插件机制允许管理员在需要时轻松安装和卸载插件,而无需对基础应用程序做出更改. NDD介绍 这里再介绍推荐下优秀的国产软件开源项目 NDD(notepad--).一个支持windows/linux/mac的文本编辑器,目标是要国产替换同类软件.对

  • SpringBoot服务监控机制原理解析(面试官常问)

    前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的. 就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 SpringBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用. 本文基于 SpringBoot 2.3.1.RELEASE 版本演示. SpringBoot 监控 SpringBoot 中的监控可以分为 H

  • Java和Dubbo的SPI机制原理解析

    SPI: 简单理解就是,你一个接口有多种实现,然后在代码运行时候,具体选用那个实现,这时候我们就可以通过一些特定的方式来告诉程序寻用那个实现类,这就是SPI. JAVA的SPI 全称为 Service Provider Interface,是一种服务发现机制.它是约定在 Classpath 下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,然后文件里面记录的是此 jar 包提供的具体实现类的全限定名. 这样当我们引用了某个 jar 包的时候就可以去找这个 jar 包

  • Java方法参数传递机制原理解析

    这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参. 这就涉及到Java中的参数传递机制,值传递. 基本数据类型 基本数据类型,值传递的体现是数值的传递. public class TransferTempTest { public static void main(String[] args) {

  • java的package和import机制原理解析

    这篇文章主要介绍了java的package和import机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在说package.import机制前我们先来了解下java的CLASSPATH. CLASSPATH顾名思义就是class的路径,当我们在系统中运行某个java程序时,它就会告诉系统在这些地方寻找这个class文件 CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; 这是

  • SpringCloud Eureka自我保护机制原理解析

    这篇文章主要介绍了SpringCloud Eureka自我保护机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 自我保护机制演示 eureka在频繁修改微服务名称的时候,可以会出现如下现象: 2. 什么是自我保护模式? 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒).但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信

  • zookeeper的watch机制原理解析

    目录 一.Watch机制介绍 二.zkCli客户端使⽤watch 2.1.get -w命令详解 2.2.ls -w命令详解 2.3.ls -R -w命令详解 三.curator客户端使⽤watch 一.Watch机制介绍 我们可以把 Watch 理解成是注册在特定 Znode 上的触发器.当这个 Znode 发⽣改变,也就是调⽤了 create , delete , setData ⽅法的时候,将会触发 Znode 上注册的对应事件,请求 Watch 的客户端会接收到异步通知. 具体交互过程如下

  • mybatis-plugin插件执行原理解析

    mybatis-plugin插件执行原理 今天主要是在看mybatis的主流程源码,其中比较感兴趣的是mybatis的plugin功能,这里主要记录下mybatis-plugin的插件功能原理. plugin集合列表:在构建SqlSessionFactory时,通过解析配置或者plugin-bean的注入,会将所有的mybatis-plugin都收集到Configuration对象的interceptorChain属性中.InterceptorChain类定义如下: public class I

  • PHP中的插件机制原理和实例

    PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现.特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响. 从一个插件安装到运行过程的角度来说,主要是三个步骤: 1.插件安装(把插件信息收集进行采集和记忆的过程,比如放到数据库中或者XML中) 2.插件激活(打开插件,让监听插件的地方开始进行调用) 3.插件运行(插件功能的实现) 从一个插件的运行上来说主要以下几点: 1.插件的动态监听和加载(插件的信息获取)

随机推荐