C++插件管理系统
插件加载目录结构
execute
plug.exe
plugify.dll
plugify.pconfig
res
cpp-lang-module.pmodule
example_plugin.pplugin
bin
cpp-lang-module.dll
example_plugin.dll
plugify.pconfig
{
"baseDir": "res",
"logSeverity": "debug",
"repositories": [
],
"preferOwnSymbols": false
}
example_plugin.pplugin
{
"fileVersion": 1,
"version": 1,
"versionName": "1.0",
"friendlyName": "PluginCPP",
"description": "An example of a plugin. This can be used as a starting point when creating your own plugin.",
"createdBy": "untrustedmodders",
"createdByURL": "https://github.com/untrustedmodders/",
"docsURL": "https://github.com/orgs/untrustedmodders/README.md",
"downloadURL": "https://github.com/orgs/untrustedmodders/example-repo.zip",
"updateURL": "https://github.com/untrustedmodders/plugify/issues",
"entryPoint": "bin/example_plugin",
"supportedPlatforms": [],
"languageModule": {
"name": "cpp"
},
"dependencies": [],
"exportedMethods": [
{
"name": "MakePrint",
"funcName": "MakePrint",
"paramTypes": [
{
"type": "int32",
"name": "count"
},
{
"type": "string",
"name": "message"
}
],
"retType": {
"type": "void"
}
}
]
}
cpp-lang-module.pmodule
{
"fileVersion": 1,
"version": 0,
"versionName": "v0",
"friendlyName": "Cpp language module",
"language": "cpp",
"description": "Adds support for C++ plugins",
"createdBy": "untrustedmodders",
"createdByURL": "https://github.com/untrustedmodders/",
"docsURL": "https://github.com/untrustedmodders/cpp-lang-module/blob/main/README.md",
"downloadURL": "https://github.com/untrustedmodders/cpp-lang-module/releases/download/v0/cpp-lang-module.zip",
"updateURL": "https://untrustedmodders.github.io/cpp-lang-module/cpp-lang-module.json",
"supportedPlatforms": [],
"forceLoad": false
}
插件定义
#include <plugify/cpp_plugin.h>
#include <plugin_export.h>
#include <iostream>class ExamplePlugin : public plugify::IPluginEntry {
public:void OnPluginStart() override {std::cout << "Example Start!" << std::endl;}void OnPluginEnd() override {std::cout << "Example End!" << std::endl;}void MakePrint(int count, const std::string& message) {for (int i = 0; i < count; ++i) {std::cout << message << std::endl;}}
} g_examplePlugin;EXPOSE_PLUGIN(PLUGIN_API, &g_examplePlugin)extern "C"
PLUGIN_API void MakePrint(int count, const std::string& message) {g_examplePlugin.MakePrint(count, message);
}
模块定义
#include <plugify/assembly.h>
#include <plugify/module.h>
#include <plugify/plugin.h>
#include <plugify/plugify_provider.h>
#include <plugify/language_module.h>
#include <plugify/cpp_plugin.h>#include <module_export.h>
#include <unordered_map>
#include <map>
#include <array>class CppLanguageModule final : public plugify::ILanguageModule {
public:CppLanguageModule() = default;// ILanguageModuleplugify::InitResult Initialize(std::weak_ptr<plugify::IPlugifyProvider> provider, plugify::ModuleRef module) override;void Shutdown() override;void OnMethodExport(plugify::PluginRef plugin) override;plugify::LoadResult OnPluginLoad(plugify::PluginRef plugin) override;void OnPluginStart(plugify::PluginRef plugin) override;void OnPluginEnd(plugify::PluginRef plugin) override;bool IsDebugBuild() override;const std::shared_ptr<plugify::IPlugifyProvider>& GetProvider() { return _provider; }plugify::MemAddr GetNativeMethod(std::string_view methodName) const;void GetNativeMethod(std::string_view methodName, plugify::MemAddr* addressDest);private:std::shared_ptr<plugify::IPlugifyProvider> _provider;std::map<plugify::UniqueId, AssemblyHolder> _assemblyMap;std::unordered_map<std::string, plugify::MemAddr, string_hash, std::equal_to<>> _nativesMap;std::vector<plugify::MemAddr*> _addresses;static std::array<void*, 15> _pluginApi;
};// ILanguageModule
InitResult CppLanguageModule::Initialize(std::weak_ptr<IPlugifyProvider> provider, ModuleRef /*module*/) {if (!(_provider = provider.lock())) {return ErrorData{ "Provider not exposed" };}_provider->Log("[CPPLM] Inited!", Severity::Debug);return InitResultData{};
}
测试
plug.exe
plugify init
[+] Info: Plugify Init!
[+] Info: Version: 1.0.0.0
[+] Info: Git: [v35-1-g08987de]:(v35) - Fix cmake typo in test on main at 'Sun Sep 1 09:21:31 2024'
[+] Info: Compiled on: Windows-10.0.19045 from: Ninja with: 'MSVC'
[~] Debug: Loading local packages
[~] Debug: Loading remote packages
[#] Error: Packages manifest from 'https://github.com/untrustedmodders/plugify/issues' has JSON parsing error: 8:1: expected_brace<!DOCTYPE html>^
[~] Debug: PackageManager loaded in 788.826ms
[~] Debug: [CPPLM] Inited!
Example Start!
[~] Debug: PluginManager loaded in 10.951ms
参考
GitHub - untrustedmodders/cpp-lang-module: C++ Language Module
创作不易,小小的支持一下吧!


相关文章:
C++插件管理系统
插件加载目录结构 execute plug.exe plugify.dll plugify.pconfig res cpp-lang-module.pmodule example_plugin.pplugin bin cpp-lang-module.dll example_plugin.dll plugify.pconfig { "baseDir&…...
MyBatis 方法重载的陷阱及解决方案
在使用 MyBatis 进行开发时,尤其是使用注解模式(如 Select、Insert 等)时,开发者常常会遇到这样一个问题:为什么我的方法重载不能正常工作? 即使在 Java 中允许方法名相同但参数不同的重载,MyBa…...
STM32 ADC+DMA导致写FLASH失败
最近用STM32G070系列的ADCDMA采样时,遇到了一些小坑记录一下; 一、ADCDMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&ha…...
Python AttributeError: ‘dict_values’ object has no attribute ‘index’
Python AttributeError: ‘dict_values’ object has no attribute ‘index’ 在Python编程中,AttributeError 是一个常见的异常类型,通常发生在尝试访问对象没有的属性或方法时。今天,我们将深入探讨一个具体的 AttributeError:“…...
三丰云免费虚拟主机和免费云服务器评测
三丰云是一家提供免费虚拟主机和免费云服务器的知名服务提供商,深受用户好评。在这篇评测文章中,我们将对三丰云的免费虚拟主机和免费云服务器进行细致评测。 首先,我们来看看三丰云的免费虚拟主机服务。三丰云的免费虚拟主机提供稳定的服务器…...
iOS18更新暂停卡住?iOS18升级失败解决办法分享
最近,苹果发布了iOS 18,许多用户都迫不及待更新更新系统体验新功能。然而,一些用户在网上反馈在iOS 18 更新在安装过程中会卡住或暂停,无法正常升级成功。 如果遇到“iOS 18更新暂停或卡住”问题,不用担心。在本文中&a…...
单片机软件工程师确认硬件
文章目录 简介流程确认能连接usb和调试器确认芯片信息确认芯片存储是否正常确认屏幕是否能点亮确认其他硬件 方式方法 简介 硬件工程师给出板子后,后面就是软件工程师的事儿了。 通常来说并不会很顺利。 流程 确认能连接usb和调试器 也是在“计算机管理”中 或者…...
乐鑫无线WiFi芯片模组,家电设备智能联网新体验,启明云端乐鑫代理商
在当今这个数字化飞速发展的时代,智能家居和物联网(IoT)设备已经成为我们生活中不可或缺的一部分。随着技术的进步,我们对于设备联网的需求也在不断提升。 智能家居、智能门锁、智能医疗设备等,这些设备通过联网实现了数据的实时传输和远程控…...
小米嵌入式面试题目RTOS面试题目 嵌入式面试题目
第一章-非RTOS bootloader工作流程 MCU启动流程 通信协议,SPI IIC MCU怎么选型,STM32F1和F4有什么区别 外部RAM和内部RAM区别,怎么分配 外部总线和内部总线区别 MCU上的固件,数据是怎么分配的 MCU启动流程 IAP是怎么升级的…...
Iceberg与SparkSQL写操作整合
前言 spark操作iceberg之前先要配置spark catalogs,详情参考Iceberg与Spark整合环境配置。 有些操作需要在spark3中开启iceberg sql扩展。 Iceberg使用Apache Spark的DataSourceV2 API来实现数据源和catalog。Spark DSv2是一个不断发展的API,在Spark版…...
MYSQL1
一、为什么学习数据库 1、岗位技能需求 2、现在的世界,得数据者得天下 3、存储数据的方法 4、程序,网站中,大量数据如何长久保存? 5、数据库是几乎软件体系中最核心的一个存在。 二、数据库相关概念 (一)数据库DB 数据库是将大量数据保存起来,通过计算机加…...
一文解答Swin Transformer + 代码【详解】
文章目录 1、Swin Transformer的介绍1.1 Swin Transformer解决图像问题的挑战1.2 Swin Transformer解决图像问题的方法 2、Swin Transformer的具体过程2.1 Patch Partition 和 Linear Embedding2.2 W-MSA、SW-MSA2.3 Swin Transformer代码解析2.3.1 代码解释 2.4 W-MSA和SW-MSA…...
Vue3:<Teleport>传送门组件的使用和注意事项
你好,我是沐爸,欢迎点赞、收藏、评论和关注。 Vue3 引入了一个新的内置组件 <Teleport>,它允许你将子组件树渲染到 DOM 中的另一个位置,而不是在父组件的模板中直接渲染。这对于需要跳出当前组件的 DOM 层级结构进行渲染的…...
项目之家:又一家项目信息发布合作对接及一手接单平台
这几天“小三劝退师时薪700”的消息甚嚣尘上,只能说从某一侧面来看心理咨询师这个职业的前景还是可以的,有兴趣的朋友可以关注下。话说上一篇文章给大家介绍了U客直谈,今天趁热打铁再给大家分享一个地推拉新项目合作平台~项目之家:…...
02-java实习工作一个多月-经历分享
一、描述一下最近不写博客的原因 离我发java实习的工作的第一天的博客已经过去了一个多月了,本来还没入职的情况是打算每天工作都要写一份博客来记录一下的(最坏的情况也是每周至少总结一下的),其实这个第一天的博客都是在公司快…...
JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看
一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小: -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…...
微信可以设置自动回复吗?
在日常的微信聊天中,我们或许会频繁地遭遇客户提出的相同问题,尤其是对于从事销售工作的朋友们来说,客户在添加好友后的第一句话往往是“在吗”或者“你好”。当我们的好友数量众多时,手动逐个回复可能会耗费大量的时间。因此&…...
同样数据源走RTMP播放延迟低还是RTSP低?
背景 在比较同一个数据源,是RTMP播放延迟低还是RTSP延迟低之前,我们先看看RTMP和RTSP的区别,我们知道,RTMP(Real-Time Messaging Protocol)和RTSP(Real Time Streaming Protocol)是…...
@开发者极客们,网易2024低代码大赛来啦
极客们,网易云信拍了拍你 9月6日起,2024网易低代码大赛正式开启啦! 低代码大赛是由网易主办的权威赛事,鼓励开发者们用低代码开发的方式快速搭建应用,并最终以作品决出优胜。 从2022年11月起,网易低代码大赛…...
数据分析-16-时间序列分析的常用模型
1 什么是时间序列 时间序列是一组按时间顺序排列的数据点的集合,通常以固定的时间间隔进行观测。这些数据点可以是按小时、天、月甚至年进行采样的。时间序列在许多领域中都有广泛应用,例如金融、经济学、气象学和工程等。 时间序列的分析可以帮助我们理解和预测未来的趋势和…...
vue基于springboot的高校二手书交易系统
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析交易流程模块后台管理模块技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 用户管理模块…...
OOM线上问题排查
场景: 项目中有一个接口,会进行全表查询,查出来3万条,查一次不会导致oom,但是频繁调用这个接口,上一次调用还没有来得及进行垃圾回收,下一次接口调用又来了,又有3万条数据࿰…...
Python箱线图实战:从原理到自定义异常值边界
1. 箱线图的核心原理与构成要素 箱线图(Box Plot)是数据分析中最实用的可视化工具之一,它用五个关键数值概括一组数据的分布特征。很多初学者容易把箱线图的上下边缘误解为数据集的最大最小值,这其实是个常见误区。让我用一个实际…...
MFShield库深度解析:非阻塞状态机与Arduino多功能扩展板工程实践
1. MFShield 多功能扩展板库技术解析与工程实践指南MFShield 是一款面向 Arduino 平台的轻量级多功能扩展板(Multi-Function Shield)专用驱动库,专为市面常见的低成本 44 按键矩阵 4 位共阴数码管 电位器 有源蜂鸣器 4 路 LED 组合扩展板…...
1929年大萧条的真相
29年的大萧条,传统经济学将那场灾难归因于投机过热,银行脆弱、需求不足等,但这只是表面因素。大萧条的本质是一场货币危机——黄金的物理极限与生产力指数级增长之间的总爆发。一战后,全球建立金本位体系,要求各国货币…...
SOONet模型Python从入门到集成:环境配置与核心调用
SOONet模型Python从入门到集成:环境配置与核心调用 如果你刚接触AI模型,想用Python把SOONet这样的模型跑起来,可能会觉得有点无从下手。环境怎么配?依赖库怎么装?模型文件放哪里?代码怎么写?这…...
【机器人导航】Ubuntu16.04下北斗星通接收机硬件连接与串口配置指南
1. 北斗星通接收机硬件连接指南 第一次接触北斗星通接收机时,我完全被它铝合金外壳的专业感震撼到了。这种工业级设备虽然看起来复杂,但只要掌握正确方法,连接起来其实比想象中简单得多。我们以NC502-D型接收机为例,这是机器人导航…...
手把手教你用QGIS加载并可视化2025年北京OSM路网SHP数据(WGS84坐标系)
零基础实战:QGIS加载OSM路网数据的完整可视化流程 第一次打开QGIS时,面对满屏的工具栏和菜单选项,很多初学者都会感到无从下手。特别是当手头有一份刚下载的SHP格式路网数据时,如何正确加载、设置坐标系并进行基础可视化ÿ…...
Closure Library调试技巧:10个高效调试方法提升开发效率
Closure Library调试技巧:10个高效调试方法提升开发效率 【免费下载链接】closure-library Googles common JavaScript library 项目地址: https://gitcode.com/gh_mirrors/cl/closure-library Closure Library是Google开发的强大JavaScript库,提…...
SRS流媒体服务器实战:手把手教你配置RTMP转WebRTC(含AAC转Opus避坑指南)
SRS流媒体服务器深度解析:RTMP转WebRTC全链路实战与音频转码优化 1. 低延迟直播技术演进与架构选型 在实时互动场景爆发的今天,传统RTMP协议的高延迟问题日益凸显。根据WebRTC标准委员会的测试数据,基于UDP的WebRTC传输链路能够将端到端延迟控…...
