我所知道的插件系统都使用动态库.基本上,您需要在系统内核和插件之间定义一个小而有效的握手.由于没有C++ ABI,插件必须只使用C API或使用与系统内核完全相同的编译器(可能还有编译器版本).
最简单的可想象的协议是一个函数,所有插件开发人员必须提供,它返回从基类派生的类的实例,作为基类指针返回.(extern "C"确保函数不会有一个错误的名称,因此更容易通过其名称找到.)类似于:
extern "C" {
plugin_base* get_plugin();
}
Run Code Online (Sandbox Code Playgroud)
然后内核尝试将在指定位置找到的二进制文件作为动态库加载并尝试查找该get_plugin()函数.如果成功,则调用此函数并以加载的插件实例结束.
当然,最好还有一些函数可以检查插件编译的API版本与内核版本的对比.(毕竟,您可能会更改该基类.)并且您可能还有其他函数,它们返回有关插件的信息(或者您将其作为基类中的虚拟对象).这在很大程度上取决于系统的性质.
| 归档时间: |
|
| 查看次数: |
1003 次 |
| 最近记录: |