• 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中。然后我使用工具时直接查询map的value,然后调用process函数,show函数,就能直接调用派生类的方法了。

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

    //----------应用程序--------------
    QMap<QString, QLibrary*> dll_map;  
    void ToolBox::GetToolDLL(QString name)
    {
        // 根据工具名称查找配置文件中的DLL路径
            QString dllPath = FindDLLPathByName(name);
            if (!dllPath.isEmpty()) {
                // 加载DLL
                QLibrary* toolDLL = new QLibrary (dllPath);
                if (toolDLL->load()) {
                	dll_map.insert(name, toolDLL);
                }
            }
    }
    //  应该还有一个函数,输入文件夹名称,拿到文件夹下的所有DLL名称,
    // 然后循环执行GetToolDLL 以加载所有的DLL
    // ....
    // ....
    // ....
    // ....
    
    Tool* ToolBox::NewToolObj(QString name)
    {
    QLibrary* libaray = dll_map.find(name).value();
    Tool* (__stdcall* CreatFunction)() = reinterpret_cast<Tool* (__stdcall*)()>(libaray ->resolve("CreatTool"));
         return CreatFunction() ;
    }
    
    //--------------------算法程序-------------------------
    class PenTool : public Tool
    {
        Q_OBJECT
    public:
        explicit PenTool (QWidget *parent = nullptr);
        ~PenTool ();
    
    private:
        Ui::PenTool *ui;
    };
    
    extern "C" __declspec(dllexport) Tool* CreatTool()
    {
        return new PenTool();
    }
    
    extern "C" __declspec(dllexport) void DestroyTool(Tool* tool)
    {
        if (tool != nullptr)
        {
            tool->Release();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
  • 相关阅读:
    risc-v dv源代码分析
    闭包的定义,原理,应用场景,优点,缺点
    【Spring】三级缓存
    Android Selinux详解[五]--新增hal服务标签相关
    机器视觉方案工程师,价值远不止于此
    【Vue】vue先转化文章内容再去除标签 vue filters过滤器去除标签 js提取文字内容
    Java的<? super T>和<? extends R>理解与应用
    CNN人脸识别(python实现)
    修改angular cli 的默认包管理器
    2023年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 原文地址:https://blog.csdn.net/qq_40709711/article/details/133255461