CTK Plugin Framework嵌入到程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wyy626562203/article/details/82782012

CTK Plugin Framework嵌入到程序

简述

在已有的应用程序中嵌入CTK插件框架。

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

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

使用CTK插件框架

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

QT += core
QT -= gui

TARGET = LoadCTKPlugin
CONFIG += console
TEMPLATE = app

LIBS += -L$$PWD/Libs -lCTKCore -lCTKPluginFramework

INCLUDEPATH += \
    $$PWD/../../CTK-master/Libs/Core \
    $$PWD/../../CTK-master/Libs/PluginFramework

SOURCES += main.cpp

根据上述流程编写main.cpp:

#include <QCoreApplication>
#include <QtDebug>

#include <ctkPluginFrameworkFactory.h>
#include <ctkPluginFramework.h>
#include <ctkPluginException.h>
#include <ctkPluginContext.h>

#include "Testing/FrameworkTestPlugins/test_plugin/test_plugin_service.h"

const QString c_strPluginPath = "E:/CTK-Examples/LoadCTKPlugin/plugins/libtest_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() << QString("Failed to install plugin") << e.what();
        return -1;
    }

    // 获取服务引用
    ctkServiceReference reference = pluginContext->getServiceReference<testPluginService>();
    // 获取指定 ctkServiceReference 引用的服务对象
    TestPluginService* testService = qobject_cast<TestPluginService *>(pluginContext->getService(reference));
    if (testService != Q_NULLPTR) {
        // 调用服务,进行认证
        bool isLogin = testService->login("root", "root");
        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 插件框架中占据着至关重要的位置。

猜你喜欢

转载自blog.csdn.net/wyy626562203/article/details/82782012