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()) {
            // 加载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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值