CTK框架(三): 插件的安装

目录

1.方式1:使用ctk框架工厂,适用于调用普通的插件

1.1.步骤

1.2.实现

2.方法2:使用ctk框架启动器,适用于需要eventadmin时

2.1.实现

3.注意事项


1.方式1:使用ctk框架工厂,适用于调用普通的插件

1.1.步骤

1) 获取插件上下文:
        通过framework->getPluginContext()方法获取插件上下文(ctkPluginContext),这是安装和启动插件所必需的。
2) 安装插件:
        使用pluginContext->installPlugin(QUrl::fromLocalFile(pluginPath))方法安装插件。其中,pluginPath是插件文件的本地路径。安装成功后,将返回一个QSharedPointer<ctkPlugin>对象,表示已安装的插件。如果安装过程中发生错误(如插件文件不存在、格式错误等),将抛出ctkPluginException异常,需要进行异常处理。

3) 启动插件:
        使用已安装的插件对象的start(ctkPlugin::START_TRANSIENT)方法启动插件。START_TRANSIENT参数表示立即启动插件,但不设置持久状态。
        如果启动失败,将抛出ctkPluginException异常,需要进行异常处理。

1.2.实现

ctkPluginFrameworkFactory frameworkFactory;
QSharedPointer<ctkPluginFramework> framework = frameworkFactory.getFramework();
// 初始化并启动插件框架
try {
    framework->init();
    framework->start();
    qDebug() << "CTK plugin framework start...";
} catch (const ctkPluginException &e) {
    qDebug() << "CTK plugin framework init err: " << e.what();
    return -1;
}

// 获取插件服务的context
ctkPluginContext* pluginContext = framework->getPluginContext();
try {
    // 安装插件
    QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(pluginPath));
    qDebug() << QString("Plugin[%1_%2] installed...").arg(plugin->getSymbolicName()).arg(plugin->getVersion().toString());
    // 启动插件
    plugin->start(ctkPlugin::START_TRANSIENT);
    qDebug() << "Plugin start...";
} catch (const ctkPluginException &e) {
    qDebug() << QString("Failed install or run plugin: ") << e.what() << e.getType();
    return -2;
}

// 获取服务引用
ctkServiceReference reference = pluginContext->getServiceReference<AbsLogService>();
if (reference) {
    // 获取指定 ctkServiceReference 引用的服务对象
    AbsLogService* service = qobject_cast<AbsLogService*>(pluginContext->getService(reference));
    if (service != Q_NULLPTR) {
        // 调用服务
        service->log("123");
    }
}
else {
    qDebug()<<"reference is null";
}

2.方法2:使用ctk框架启动器,适用于需要eventadmin时

2.1.实现

QString path = QDir::currentPath() + "/third_libs/ctk/linkPlugin";
// 在插件的搜索路径列表中添加一条路径
ctkPluginFrameworkLauncher::addSearchPath(path);
ctkPluginFrameworkLauncher::start("org.commontk.eventadmin");
// 获取插件上下文
ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext();
// 启动插件 BlogEventHandler
try {
    QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(pluginPath1));
    plugin->start(ctkPlugin::START_TRANSIENT);
    qDebug() << "BlogEventHandler start ...";
} catch (const ctkPluginException &e) {
    qDebug() << "Failed to start BlogEventHandler" << e.what();
}
// 启动插件 BlogManager
try {
    QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(pluginPath2));
    plugin->start(ctkPlugin::START_TRANSIENT);
    qDebug() << "BlogManager start ...";
} catch (const ctkPluginException &e) {
    qDebug() << "Failed to start BlogManager" << e.what();
}
// 停止插件
ctkPluginFrameworkLauncher::stop();

3.注意事项

1)插件文件命名和格式:插件文件(通常是DLL文件)的命名和格式需要符合CTK插件框架的要求。通常,插件文件应该包含必要的元数据文件(如MANIFEST.MF),并且遵循特定的目录结构。

        MANIFEST.MF文件添加的目录结构如下图所示:

2)插件依赖:确保插件所需的所有依赖项都已正确配置。如果插件依赖于其他库或插件,这些依赖项必须在插件加载之前被正确加载和初始化。
3)环境变量和配置:在某些情况下,插件的加载和运行可能受到环境变量和配置的影响。因此,在安装和启动插件之前,请确保已正确设置相关的环境变量和配置。
4)错误处理和日志记录:在安装和启动插件的过程中,应该进行充分的错误处理和日志记录。这有助于诊断问题并快速修复错误。
5)插件管理:插件框架提供了丰富的API来管理插件的生命周期和服务。开发人员可以利用这些API来实现插件的动态加载、卸载、更新等功能。

通过以上步骤,您可以在CTK插件框架中成功安装并启动插件。在实际应用中,您可能需要根据具体的项目需求和环境配置进行适当的调整和优化。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值