网站怎么用,html网页设计代码作业网站,网站域名管理中心,电子商务网站软件建设的有这样一个场景#xff0c;我有一个GUI软件#xff0c;把他想象成PS软件#xff0c;集成了很多工具。现在我要添加新算法(PS工具)#xff0c;该怎么办#xff1f; 有三种办法#xff1a; 第一种我把新算法代码加到项目中#xff0c;编译整个项目。 第二种#xff0c;新…有这样一个场景我有一个GUI软件把他想象成PS软件集成了很多工具。现在我要添加新算法(PS工具)该怎么办 有三种办法 第一种我把新算法代码加到项目中编译整个项目。 第二种新算法代码封装成库然后调用库增添少量代码编译整个项目。 第三种源代码修改可加载DLL拿到DLL中的方法。DLL是派生类。 第一种第二种就不说了详细说下第三种。
我首先写一个基类Tool里面有process函数show函数。
然后新算法头继承自tool比如钢笔工具PenTool。将工具打包成DLLPenTool.dll其中有一个概关键函数叫做CreatTool返回类型为Tool* 但是实际返回 new PenTool。有点像工厂模式。
在应用程序中PS软件初始化时加载DLL获取所有DLL的CreatTool函数保存在mapstring,function中。然后我使用工具时直接查询map的value然后调用process函数show函数就能直接调用派生类的方法了。
下面给出部分代码 首先是如何在应用程序中加载DLL
//----------应用程序--------------
QMapQString, 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();}
}