C++插件管理类(下)——实际项目(阉割版)
文章目录
- 一、背景
- 二、代码结构
- 三、两个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 });
五、 踩坑点
一.名字空间:ExtensionSystem ExtensionSystem命名空间提供了属于核心插件系统的类. ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IP ... 2021SC@SDUSC 目录 前言: office插件管理分析: 1.public void startOfficeManager(): 启动Office组件进程 2.public OfficeDo ... 前言 在项目中经常会用到SharedPreferences来存储一些配置信息,比如用户的账号信息等.但是当项目大了之后如果还在要使用时再单独创建和使用SharedPreferences就会造成Shar ... 对于一个喜欢玩机进阶者来说,电脑一定会安装一款"模拟器",毕竟安卓软件有时候下载到手机上会显示有病毒什么的,导致很多人不敢安装使用.对于我们软件测评人员来说,有了模拟器就可以极大的 ... 文章目录 一.Flutter 包和插件管理平台 二.Flutter 插件搜索示例 三.Flutter 插件装示例 1.添加 Dart 包依赖 2.获取 Dart 包 3.使用 Dart 包 4.官方的 ... 场景 CentOS中Jenkins的下载.安装.配置与启动(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11649 ... 十一休假,杭州西湖边逛了一圈只能用人山人海来形容,浙大紫金港校区也逛了一圈风景如画,建设得真不错很棒,假期就去了这2个地方,然后在家里陪老婆.看孩子.洗尿布.打了几局星际争霸,在网上接了一个B/S架构 ... 目录 一.后台角色管理(下) 1.查询角色权限 2.修改角色权限 3.优化侧边栏菜单 二.后台权限管理 1.权限列表 2.新增权限 3.修改权限 4.删除权限 一.后台角色管理(下) 1.查询角色权限 ... 实力踩坑npm,自从用了npm之后项目构建和插件管理确实方便了很多,但也是被坑的不要不要的.由于平时只是用用,并没有深入了解node的npm,所以遇到问题都比较棘手,能够查到的资料也不多.阐述以下我遇 ...C++插件管理类(下)——实际项目(阉割版)相关推荐
最新文章
热门文章