当前位置: 首页 > news >正文

QT读取DLL加载算法

有这样一个场景,我有一个GUI软件,把他想象成PS软件,集成了很多工具。现在我要添加新算法(PS工具),该怎么办?
有三种办法:
第一种我把新算法代码加到项目中,编译整个项目。
第二种,新算法代码封装成库,然后调用库,增添少量代码,编译整个项目。
第三种,源代码修改,可加载DLL,拿到DLL中的方法。DLL是派生类。
第一种第二种就不说了,详细说下第三种。

我首先写一个基类Tool,里面有process函数,show函数。

然后,新算法头继承自tool,比如钢笔工具PenTool。将工具打包成DLL,PenTool.dll,其中有一个概关键函数叫做CreatTool,返回类型为Tool* ,但是实际返回 new PenTool。有点像工厂模式。

在应用程序中(PS软件),初始化时加载DLL,获取所有DLL的CreatTool函数,保存在map<string,function>中。然后我使用工具时直接查询map的value,然后调用process函数,show函数,就能直接调用派生类的方法了。

下面给出部分代码:
首先是如何在应用程序中加载DLL

//----------应用程序--------------
QMap<QString, QLibrary*> dll_map;  
void ToolBox::GetToolDLL(QString name)
{// 根据工具名称查找配置文件中的DLL路径QString dllPath = FindDLLPathByName(name);if (!dllPath.isEmpty()) {// 加载DLLQLibrary toolDLL(dllPath);if (toolDLL.load()) {dll_map.insert(name, toolDLL);}}
}
//  应该还有一个函数,输入文件夹名称,拿到文件夹下的所有DLL名称,
// 然后循环执行GetToolDLL 以加载所有的DLL
// ....
// ....
// ....
// ....Tool* ToolBox::NewToolObj(QString name)
{return (Tool*)((QLibrary*)dll_map[name]->resolve("CreatTool"));
}//--------------------算法程序-------------------------
class PenTool : public Tool
{Q_OBJECT
public:explicit PenTool (QWidget *parent = nullptr);~PenTool ();private:Ui::PenTool *ui;
};extern "C" SS_EXPORT Tool* CreatTool()
{return new PenTool();
}extern "C" SS_EXPORT void DestroyTool(Tool* tool)
{if (tool != nullptr){tool->Release();}
}
http://www.lryc.cn/news/174741.html

相关文章:

  • HTTPX-用于Python的下一代HTTP客户端
  • [LLM+AIGC] 01.应用篇之中文ChatGPT初探及利用ChatGPT润色论文对比浅析(文心一言 | 讯飞星火)
  • OCR -- 文本检测
  • 【系统架构】软件可靠性基础知识
  • 相机Camera
  • 洛谷P8815:逻辑表达式 ← CSP-J 2022 复赛第3题
  • ElementUI实现登录注册+axios全局配置+CORS跨域
  • Vue 07 Vue中的数据代理
  • Foxit PDF SDK Windows 9.1 Crack
  • UG NX二次开发(C++)-采用NXOpen方法计算体的质心
  • Java代码审计17之fastjson反序列化漏洞(2)
  • Fork/Join 框架是干什么的?
  • 电子信息工程专业课复习知识点总结:(五)通信原理
  • LeetCode算法二叉树—二叉树的中序遍历
  • ubuntu 18.04 中 eBPF samples/bpf 编译
  • 新版Chromedriver在哪下载(Chromedriver 116.0.5845.188的寻找之旅)
  • React基础知识点
  • linux用户和权限命令学习记录
  • React(react18)中组件通信05——redux ➕ react-redux(含数据共享)
  • 字符函数和字符串函数(1)
  • Visual Studio Code从GIT拉取vue项目并运行
  • 【知识分享】Java获取全年每个月的有几周且每周是几号到几号
  • 学信息系统项目管理师第4版系列11_信息安全管理
  • sql注入原理分析
  • Mac磁盘空间满了怎么办?Mac如何清理磁盘空间
  • 能ping通但无法上网的问题
  • 仿制 Google Chrome 的恐龙小游戏
  • Redis面试题(五)
  • 组队竞赛(int溢出问题)
  • Swift SwiftUI 隐藏键盘