怎么编写基于 QPlugins 的插件程序

1个回答

写回答

123yxxyy

2025-12-28 10:11

+ 关注

linux
linux

QPlugins 是一个正在开发中的插件引擎,它提供了基于 DLL、BPL 或 SO 的加载器来加载插件里的服务。目前已经有三种类型的加载器可供选择:1. DLL 加载器:适用于 Windows 平台,名为 TQDynamicLibraryLoader;2. BPL 加载器:适用于 Delphi 的 BPL 插件,支持多种平台;3. SO 加载器:适用于 linux / FreeBSD 系统的操作系统,目前 Delphi 无法生成对应的 SO,并且需要使用 GCC 或其它工具生成相应的 SO。QPlugins 的 PluginsManager 实例提供了服务注册和释放接口。如果需要使用外部插件提供的服务,在程序启动时,需要在宿主程序中引入 QPlugins 单元和自己想用的加载器实现单元,并调用 PluginsManager.Loaders.Add 方法来加入相应的加载器。然后可以调用 PluginsManager.Start 方法来加载插件并完成各项服务注册。通过 PluginsManager.ByPath 或 PluginsManager.ById 函数可以获取到相应的服务实例,从而利用这些服务提供的功能实现实际业务。程序退出时,会自动调用 PluginsManager.Stop 方法停止所有正在运行的服务。提供服务的插件可以是可执行程序,也可能是普通的文本文件(如脚本)。在加载器加载相应文件时,负责将自身提供的服务注册到 PluginsManager 里,并提供给其他程序使用。具体的实现方式对于 PluginsManager 来说是透明的。例如,以一个 DLL 插件为例,QPlugins 提供了 QPlugins.VCL 单元,用户如果编写基于 VCL 的 DLL 插件,则需要包含它以保证能够正确处理窗口消息。插件程序的编写步骤包括:1. 编写服务接口实现;2. 根据加载器约定方式提供服务注册和释放接口。加载器会调用相应的接口来完成服务注册,在卸载插件时会调用相应的接口来完成服务释放。当然这些接口可能与系统自带的接口相同,也可能通过加载器约定特定的接口方式。具体实现细节取决于加载器和插件本身而宿主应用无需关心这些细节。我们还需要了解以下几点:1. 服务名称和 ID 在 QPlugins 中允许重复存在,在没有实现路由器之前,始终会找到第一个提供者。只有当路由器被实现时,才能由路由器规定如何处理。2. 宿主程序可以调用插件提供的服务,同时插件也可以调用宿主程序提供的服务。只需使用 PluginsManager 查询到相应实例即可。3. 注册服务时,请直接使用 “Services” 分支进行注册,而不要使用 “PluginsManager.ByPath/ById” 方法来获取服务上级节点。“PluginsManager.ByPath/ById” 方法是提供给调用者使用的,并且可能会经过路由器过滤从而映射到其他实际路径上。4. 建议注册服务时放在自己的命名空间下,避免与其他人的实现存在命名冲突。这是基于建议而非强制规定,便于与其他用户共享插件。5. 单实例和多实例问题由服务本身来决定。如果需要支持多实例,则需要重载“GetInstance” 方法返回新的实例。默认情况下,返回的是自身实例,即单实例。6. 服务可能具有线程安全特性,也可能不具有线程安全特性。在使用相关服务之前,请确保了解该服务是否是线程安全的。以上是对 QPlugins 插件引擎及其相关功能的简要说明。

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号