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文章来源地址https://uudwc.com/A/ZGkp1

//----------应用程序--------------
QMap<QString, QLibrary*> dll_map;  
void ToolBox::GetToolDLL(QString name)
{
    // 根据工具名称查找配置文件中的DLL路径
        QString dllPath = FindDLLPathByName(name);
        if (!dllPath.isEmpty()) {
            // 加载DLL
            QLibrary 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();
    }
}

原文地址:https://blog.csdn.net/qq_40709711/article/details/133255461

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年09月25日 10:47
初识Java 10-1 集合
下一篇 2023年09月25日 10:47