在程序中嵌入 CTK 插件框架

来源:互联网 发布:hadoop编程 编辑:程序博客网 时间:2024/06/14 02:03

简述

如果已经创建了一个应用程序,如何将 CTK 插件框架嵌入其中呢?

关于 CTK 插件框架的使用,主要分为以下几步:

  • 初始化并启动插件框架:由 ctkPluginFramework::init()ctkPluginFramework::start() 完成
  • 获取上下文:由 ctkPluginFramework::getPluginContext() 完成
  • 安装插件:由 ctkPluginContext::installPlugin() 完成,与此同时,会返回一个 ctkPlugin 对象。
  • 启动插件:由 ctkPlugin::start() 完成
  • 获取服务引用:由 ctkPluginContext::getServiceReference() 完成
  • 获取指定 ctkServiceReference 引用的服务对象:由 ctkPluginContext::getService() 完成
  • 调用服务

  • 简述
  • 使用 CTK 插件框架

版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820

使用 CTK 插件框架

关于如何编写 CTK 插件,请参考:创建 CTK 插件(CMake) 。下面,来演示如何使用 CTK 插件框架来获得特定的服务。

这里写图片描述

创建一个 Qt 控制台应用程序,.pro 内容如下:

QT += coreQT -= guiTARGET = LoadCTKPluginCONFIG += consoleTEMPLATE = appLIBS += -L$$PWD/Libs -lCTKCore -lCTKPluginFrameworkINCLUDEPATH += \    $$PWD/../../CTK-master/Libs/Core \    $$PWD/../../CTK-master/Libs/PluginFrameworkSOURCES += main.cpp

由于 CTKPluginFramework 依赖于 CTKCore 模块,所以也需要将其添加进来。

按照上述流程,main.cpp 写起来会就容易很多:

#include <QCoreApplication>#include <QtDebug>#include <ctkPluginFrameworkFactory.h>#include <ctkPluginFramework.h>#include <ctkPluginException.h>#include <ctkPluginContext.h>#include "Testing/FrameworkTestPlugins/auth_plugin/auth_plugin_service.h"const QString c_strPluginPath = "E:/CTK-Examples/LoadCTKPlugin/plugins/libauth_plugin.dll";int main(int argc, char *argv[]){    QCoreApplication app(argc, argv);    ctkPluginFrameworkFactory frameWorkFactory;    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();    try {        // 初始化并启动插件框架        framework->init();        framework->start();        qDebug() << "CTK Plugin Framework start ...";    } catch (const ctkPluginException &e) {        qDebug() << "Failed to initialize the plugin framework: " << e.what();        return -1;    }    // 获取插件上下文    ctkPluginContext* pluginContext = framework->getPluginContext();    try {        // 安装插件        QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(c_strPluginPath));        // 启动插件        plugin->start(ctkPlugin::START_TRANSIENT);        qDebug() << "Plugin start ...";    } catch (const ctkPluginException &e) {        qDebug() << "Failed to install plugin" << e.what();        return -1;    }    // 获取服务引用    ctkServiceReference reference = pluginContext->getServiceReference<AuthPluginService>();    // 获取指定 ctkServiceReference 引用的服务对象    AuthPluginService* authService = qobject_cast<AuthPluginService *>(pluginContext->getService(reference));    if (authService != Q_NULLPTR) {        // 调用服务,进行认证        bool isLogin = authService->login("root", "123456");        if (isLogin) {            qDebug() << "Login successfully";        } else {            qDebug() << "Login failed";        }    }    return app.exec();}

ctkPluginContext 是框架内一个插件的执行上下文,该上下文用于授予对其他方法的访问权,以便插件可以与框架进行交互。

ctkPluginContext 提供的方法允许插件:

  • 订阅由框架发布的事件
  • 使用 Framework service registry 注册服务对象
  • Framework service registry 检索 ServiceReferences
  • 为引用的服务获取和发布服务对象
  • 在框架中安装新的插件
  • 获取框架中安装的插件列表
  • 获得一个插件的 ctkPlugin 对象
  • 为(由框架为插件提供的)持久存储区域中为文件创建 QFile 对象

由此可见,ctkPluginContext 在 CTK 插件框架中占据着至关重要的位置。

原创粉丝点击