文章目录

  • 一、背景
  • 二、代码结构
  • 三、两个CMakeLists.txt
    • 3.1 父目录
    • 3.2 子目录src
  • 四、代码实例
    • 4.1 main.cpp
    • 4.2 Plugin.h
    • 4.3 Plugin.cpp
    • 4.4 Comm.h
    • 4.5 calc.cpp
  • 五、 踩坑点
  • 七、 项目地址

一、背景

请参考C++插件管理类(上)

二、代码结构

三、两个CMakeLists.txt

3.1 父目录

#设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)
# Set CMAKE_SKIP_BUILD_RPATH to TRUE
# 设置工程的名称
project(PluginManagers)# 设置库和可执行文件的输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})add_subdirectory(src)
# 将源代码添加到工程生成可执行文件
add_executable(PluginManagers main.cpp Plugin.h Plugin.cpp Comm.h)

3.2 子目录src

cmake_minimum_required(VERSION 3.0)
message("${CMAKE_BINARY_DIR}/${IDE_BIN_DIR}")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${IDE_BIN_DIR})
add_library(calcu SHARED "calcu.cpp")

四、代码实例

4.1 main.cpp

#include<iostream>
#include <vector>
#include "Plugin.h"
#include "Comm.h"
using namespace std;
typedef int (*_add_function_)(int a, int b);
typedef int (*_sub_function_)(int a, int b);
int main()
{PluginMannager plug;if (FAILURE == plug.tuiLoadPlugin("calcu")){cout << "Has No DLL" << endl;}void* func = nullptr;if (FAILURE == plug.getFunction(func, ADD_FUNCTION)){return false;}int Sum=((_add_function_)func)(1,2);cout << "Sum is:" << Sum << endl;if (FAILURE == plug.getFunction(func, SUB_FUNCTION)){return false;}int Sub= ((_sub_function_)func)(1, 2);cout << "Sub is:" << Sub << endl;return 0;
}

4.2 Plugin.h

#include<iostream>
#include <vector>
using namespace std;
typedef void* PluginHandle;
typedef struct PluginInterfaceInformatin
{string dllName = "";string version = "";string interfaceName = "";PluginHandle function = NULL;int type = -1;}PluginInfo;using PluginInfoVector = std::vector<PluginInfo>;class Plugin
{public:bool Init(const std::string& filename);bool Execute(void* &func, int type);
private:PluginHandle handle = nullptr;PluginInfoVector EntryVector;
};class PluginMannager
{public:/*加载插件*/bool tuiLoadPlugin(const std::string& filename);/*获取函数指针*/bool getFunction(void*& func, int type);
private:/*插件库*/std::vector<Plugin> pluginList;
};

4.3 Plugin.cpp

#include "Plugin.h"
#include "Comm.h"
#include <Windows.h>bool Plugin::Init(const std::string& filename)
{PluginHandle handle = nullptr;handle = LoadLibrary(filename.c_str());if (handle == nullptr)return FAILURE;this->handle = handle;this->EntryVector.swap(*(PluginInfoVector*)GetProcAddress((HMODULE)handle, str(plugins)));return SUCCESS;
}bool Plugin::Execute(void* &func, int type)
{for (auto& entry : this->EntryVector){if(type == entry.type){func = entry.function;return SUCCESS;}}return 0;
}bool PluginMannager::tuiLoadPlugin(const std::string& filename)
{Plugin plug;if (FAILURE == plug.Init(filename)){return FAILURE;}this->pluginList.push_back(plug);return SUCCESS;
}bool PluginMannager::getFunction(void*& func, int type)
{for (auto& plug : pluginList){if (SUCCESS == plug.Execute(func, type)){return SUCCESS;}else{return FAILURE;}}return SUCCESS;
}

4.4 Comm.h

#if (_WIN32) || (_WIN64)
#define PLUGIN_EXPORT extern "C" _declspec(dllexport)
#else
#define PLUGIN_EXPORT exter "C"
#endiftypedef enum PLUGIN_FUN_TYPE
{ADD_FUNCTION = 0,SUB_FUNCTION
};#define __data__ plugins#define PLUGIN_DATA(...) PluginInfoVector __data__={__VA_ARGS__}#define PLUGIN_DEFINE                     \
PLUGIN_EXPORT PluginInfoVector  __data__ ;\

#define str(e) #e#define SUCCESS 0
#define FAILURE 1

4.5 calc.cpp

#include "../Plugin.h"
#include "../Comm.h"
PLUGIN_DEFINEint add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}PLUGIN_DATA({ "calc", "1.0","add",(void*)add, ADD_FUNCTION }
,{ "calc", "1.0","sub",(void*)sub, SUB_FUNCTION });

五、 踩坑点

C++插件管理类(下)——实际项目(阉割版)相关推荐

  1. 【Qt】通过QtCreator源码学习Qt(七):插件管理类简介

    一.名字空间:ExtensionSystem ExtensionSystem命名空间提供了属于核心插件系统的类. ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IP ...

  2. kkFileView代码分析(四)——office文件的转换(1)office插件管理

    2021SC@SDUSC 目录 前言: office插件管理分析: 1.public void startOfficeManager(): 启动Office组件进程 2.public OfficeDo ...

  3. Android自己搭建一个实用的SharedPreferences管理类

    前言 在项目中经常会用到SharedPreferences来存储一些配置信息,比如用户的账号信息等.但是当项目大了之后如果还在要使用时再单独创建和使用SharedPreferences就会造成Shar ...

  4. 雷电模拟器怎么让有一些用另外一条网络_对不起了“网易”,阉割版似乎更好用...

    对于一个喜欢玩机进阶者来说,电脑一定会安装一款"模拟器",毕竟安卓软件有时候下载到手机上会显示有病毒什么的,导致很多人不敢安装使用.对于我们软件测评人员来说,有了模拟器就可以极大的 ...

  5. 【Flutter】Flutter 项目中使用 Flutter 插件 ( Flutter 插件管理平台 | 搜索 Flutter 插件 | 安装 Flutter 插件 | 使用 Flutter 插件 )

    文章目录 一.Flutter 包和插件管理平台 二.Flutter 插件搜索示例 三.Flutter 插件装示例 1.添加 Dart 包依赖 2.获取 Dart 包 3.使用 Dart 包 4.官方的 ...

  6. Jenkins中安装Credentials Binding插件实现凭证管理与安装Git插件和拉取代码构建项目

    场景 CentOS中Jenkins的下载.安装.配置与启动(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11649 ...

  7. 3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    十一休假,杭州西湖边逛了一圈只能用人山人海来形容,浙大紫金港校区也逛了一圈风景如画,建设得真不错很棒,假期就去了这2个地方,然后在家里陪老婆.看孩子.洗尿布.打了几局星际争霸,在网上接了一个B/S架构 ...

  8. 项目实战之旅游网(五)后台角色管理(下) 后台权限管理

    目录 一.后台角色管理(下) 1.查询角色权限 2.修改角色权限 3.优化侧边栏菜单 二.后台权限管理 1.权限列表 2.新增权限 3.修改权限 4.删除权限 一.后台角色管理(下) 1.查询角色权限 ...

  9. npm ERR! code ERR_STREAM_WRITE_AFTER_END npm install 报错实力踩坑npm,自从用了npm之后项目构建和插件管理确实方便了很多,但也是被坑的不要不要的

    实力踩坑npm,自从用了npm之后项目构建和插件管理确实方便了很多,但也是被坑的不要不要的.由于平时只是用用,并没有深入了解node的npm,所以遇到问题都比较棘手,能够查到的资料也不多.阐述以下我遇 ...

最新文章

  1. 解决 Angular 官网下载的库 Schematics 执行 npm run build 时遇到的编译错误
  2. eclipse中无法移除jar包_IDEA中已配置阿里镜像,但maven无法下载jar包的问题
  3. 三相电压和电流的模拟前端处理
  4. laravel安装laravel-ide-helper扩展进行代码提示(二)
  5. jquery 获取checkbox 或 select 的选中值(一组和单个)
  6. centos php7 redis,CentOS7 yum快速安装php7.1+nginx+mysql+redis
  7. OSChina 周日乱弹 ——局长才是真神
  8. 城市天际线 android,都市天际线安卓手机版
  9. 【笔试/面试】—— Linux 查看 cpu 和内存使用情况
  10. pymysql 数据库操控
  11. 0x7c97cd12 指令引用的 0x00000014内存。该内存不能为written
  12. 鬼话描绘形式_桥接形式
  13. 【C#】eventlog类的使用
  14. vs2010操作excel 需要安装office2010
  15. 一键打开常用软件(bat/vbs)
  16. 淘宝店铺排名还在用老方法吗,优化店铺排名方法是否正确?
  17. javascript引入方式:嵌入式,外链式,行内式
  18. html rfftq15.gif,STM32F4系列完整固件库
  19. uniapp开发的微信小程序如何上传至微信小程序平台-完整简单步骤
  20. php在线加密源代码,2019最新PHP在线云加密平台源码

热门文章

  1. 一个较复杂的React服务端渲染示例(React-Koa-Redux等)
  2. 俄罗斯总统确认支持自由软件
  3. 字符串和比特流编码问题
  4. 关于 “什么是互联网?” 的采访记录
  5. 多域名实现单点登录详解
  6. Netty基本使用示例
  7. 大疆“御”Mavic拆机报告,主要核心器件
  8. JS红书宝--var,let和const声明变量
  9. mysql数据库一个表20万条数据可以_mysql生成20万条数据(连表插入)
  10. 云计算基本概念IaaS,PaaS,SaaS和Serverless