插件式框架学习(1)

发布时间:2026/10/28 10:17:42
插件式框架学习(1) lianpeiliang/LearnFramework: 基于 C / Qt 5 的轻量级桌面插件框架学习项目包含应用启动、命令与消息分发、插件加载及服务注册。它是一个基于 C / Qt 5 的桌面插件框架学习版目前运行后主要显示一个空窗口还没有具体业务功能。核心价值是演示应用启动、命令分发、插件加载和共享对象管理。软件是怎样运行的启动流程比较清晰main 创建 QApplication → 创建 ApplicationHost → CommandBindings 注册命令 1000对应 PluginLoader → ApplicationHost::show() 发送命令 1000 → CommandBus 找到 PluginLoader → 扫描程序旁的 plugins 文件夹 → 加载插件并调用 initialize() → 显示主窗口进入 Qt 事件循环现在调用这行是不是没有效果对当前没有插件时这行不会产生可见效果但它确实执行了。它会走完这条调用链发送命令 1000 → 找到已注册的 PluginLoader → 调用 PluginLoader::dispatchCommand() → 扫描程序旁的 plugins 文件夹如果文件夹不存在或里面没有动态库就没有插件需要初始化函数直接返回true这里也没有使用返回值。所以现在没有插件注释掉这行显示出来的空窗口效果相同。以后有符合接口的插件这行会加载插件并调用initialize()就有实际作用了。那你帮我写一下1000这个插件吧功能简单点即可写好了插件功能很简单加载后显示“示例插件”窗口。点击“点我计数”显示累计点击次数。退出主程序时自动释放窗口。Release v1.0.1 · lianpeiliang/LearnFramework这是v1.0.1载入了一个插件。提问1000代表什么1000是这个项目自行约定的**“加载插件”命令编号**不是 Qt 规定的也不是某个插件的编号。它在两处配合使用注册命令时registerHandler(1000, new PluginLoader);意思是收到命令 1000就交给 PluginLoader 处理。发送命令时dispatchCommand(1000, path.data(), path.size());意思是让 PluginLoader 扫描 path 指定的目录加载里面符合接口的插件。所以DemoPlugin能被加载是因为它位于plugins目录并实现了Plugin接口。以后这个目录里有多个插件命令1000也会一起尝试加载它们。你可以把1000改成其他未占用的编号只要注册、发送以及加载器内部的编号判断保持一致即可。所以1000实际上是一个命令用来加载plugins目录下的所有动态库对更准确地说1000是“加载插件”命令的编号。当前代码收到它后会扫描plugins目录第一层的所有动态库文件尝试加载。只有符合 Qt 插件格式、实现了约定的Plugin接口并且initialize()成功的插件才会被保留。所以普通 DLL 即使放进去也不一定能作为插件加载。