有这样一个场景,我有一个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函数,就能直接调用派生类的方法了。文章来源:https://uudwc.com/A/ZGkp1
下面给出部分代码:
首先是如何在应用程序中加载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();
}
}