插件系统的构建

从去年开始,我就在思考如何对我们的程序进行改进,因为我们的项目更多的是对现有软件的定制,于是我开始在思考如何构建插件系统,通过对这些插件的动态加载与卸载,这段时间在新项目中已经试验了,不过现在还是以LIB库嵌入程序中,后期将会采用dll库动态加载

1.整理系统的接口
今年接手后,我开始整理接口,后续的定制开发将会使用这些接口而不是直接在主干上进行修改,我对主干的代码现在有绝对的控制权,不允许别人去修改他, 接口需要经过我的同意后才能合进主干,并且在整理接口的时候,尽量将接口原子化,接口声明也都是C代码,我在想后续开发是否可以通过Lua来进行,当然这个想法只是从去年年底开始酝酿

2.使用回调机制
我们以前的开发是直接原有的代码上修改,然后通过配置文件或者宏来定义,这样做的后果就是代码复杂难以维护,一个文件里面有5000行代码很正常,而且合并非常困难,我们的以前的主管都是用人工下去合并的,出错几率非常高,去年我就深受这种开发模式之苦
后面我采用function和bind配合来提供类似于回调机制,其实原来系统内有一些接口已经提供了这种机制了,不过是使用虚函数的机制,但是因为我们的插件是构建在DLL上的,这样就要尽量避免DLL hell( http://blog.csdn.net/happydeer/article/details/8776) 的问题,最好不要使用虚函数,这个也是采用C代码而不是C++的原因之一
当用户利用bind将一个函数绑定后并且向我们的系统注册后,当时间发生的时候,系统将会一一通知这些函数,从这个项目开始,我们采用这种方式后,效率和维护简便了很多

从项目开始到现在,主要还是在做上面的事情,并且在新项目中使用这些,现在的"插件"还是在原有的解决方案里面加一个项目,然后按照上面的方式进行开发,后期只要改一下配置以及增加DLL管理模块,增加DLL导出接口就可以了,项目后面验收完毕后,将会开始采用这种方式下去开发

3.DLL的动态加载
DLL其实内部原理有点类似于我们的EXE程序,都是PE文件的格式,更重要的是,DLL在加载和卸载的时候都会有通知,这样,我们实际上可以将我们的插件当成一个程序
http://www.blogjava.net/yipak/articles/182025.html




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 ctkpluginframework 插件系统构建项目,可以将应用程序拆分成多个独立的插件,每个插件可以独立编译、打包和部署。这种方式可以提高应用程序的可维护性和可扩展性,使得不同的开发人员可以独立进行开发和测试。 下面是一个使用 ctkpluginframework 插件系统构建项目的实战示例: 1. 创建一个主应用程序 首先,我们需要创建一个主应用程序,它将作为整个应用程序的入口点。可以使用 Qt Creator 创建一个新的 Qt 应用程序项目。在创建项目时,选择“Qt Widgets Application”,并勾选“Create Main Window”选项。 2. 集成 ctkpluginframework 库 在 Qt Creator 中,打开项目的 .pro 文件,并添加下面这行代码: ``` LIBS += -lctkPluginFramework ``` 这将链接 ctkpluginframework 库到项目中。 3. 创建插件接口 在项目中创建一个新的接口类,例如: ```cpp class MyPluginInterface { public: virtual ~MyPluginInterface() {} virtual void doSomething() = 0; }; ``` 这个接口将定义所有插件需要实现的方法。 4. 创建插件 创建一个新的 Qt 应用程序项目,并选择“Library”类型。在创建项目时,勾选“Export as a library”选项。 在项目中实现 MyPluginInterface 接口: ```cpp #include "myplugininterface.h" class MyPlugin : public QObject, public MyPluginInterface { Q_OBJECT Q_INTERFACES(MyPluginInterface) public: void doSomething() override; }; void MyPlugin::doSomething() { // 实现具体的插件逻辑 } ``` 5. 注册插件 在主应用程序中,使用 ctkPluginFramework API 注册插件: ```cpp #include <ctkPluginFramework.h> #include "myplugininterface.h" Q_IMPORT_PLUGIN(MyPlugin) QList<MyPluginInterface*> plugins; ctkPluginContext* context = ctkPluginFrameworkFactory::getFramework()->getPluginContext(); QList<ctkServiceReference> refs = context->getServiceReferences<MyPluginInterface>(); foreach (ctkServiceReference ref, refs) { plugins.append(qobject_cast<MyPluginInterface*>(context->getService(ref))); } ``` 这将获取所有实现 MyPluginInterface 接口的插件,并将它们添加到 plugins 列表中。 6. 加载插件 在应用程序启动时,使用 ctkPluginFramework API 加载插件: ```cpp ctkPluginFrameworkFactory factory; ctkPluginFramework* framework = factory.newFramework(); framework->init(); framework->start(); context = framework->getPluginContext(); QStringList pluginPaths; pluginPaths << "path/to/MyPlugin.dll"; foreach (QString pluginPath, pluginPaths) { QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(pluginPath)); plugin->start(); } ``` 这将加载 MyPlugin.dll 插件,并启动它。 7. 使用插件 在主应用程序中,可以使用插件提供的功能: ```cpp foreach (MyPluginInterface* plugin, plugins) { plugin->doSomething(); } ``` 这将调用所有已加载插件的 doSomething 方法。 以上就是使用 ctkpluginframework 插件系统构建项目的实战示例。需要注意的是,这只是一个简单的示例,实际应用中可能需要更多的代码来处理插件的生命周期、依赖项解析等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值