基本上,如何编写插件系统,其中每个插件都是DLL。 (或者是否有更好的插件系统方式,每个插件都是本地编写的?)
假设每个DLL都提供了一些可用于其他插件的功能。如果插件A确实提供了FuncA而插件B需要FuncA,那么应该如何管理依赖?应该如何识别插件(GUIDS?)如何加载DLL?该如何调用该函数?
我不熟悉DLL,而且我在询问Windows API调用的范围,这些调用可以实现这一目标。
答案 0 :(得分:1)
让您的DLL导出一个函数,返回有关插件本身的元信息,即版本,依赖项,导出的功能等。当遍历插件目录时,通过LoadLibrary
动态加载该目录中的DLL并检查它们是否存在导出符合查询功能的符号(通过GetProcAddress
)。如果是这样,加载DLL,尝试查询插件并从中获取一些有意义的信息。
请确保为您的插件系统采用某种版本管理,以适应API更改。 Windows本身通过将版本信息(有时以结构大小的形式)传递给某些函数来实现它。
对于依赖项,请构建依赖关系图。如果您检测到循环依赖项(例如使用Floyd's algorithm),请询问用户要执行的操作,即要禁用的插件。如果图表中没有循环,则可以遍历(定向)图形以确定插件的加载顺序。
根据评论中的问题进行编辑:
DLL1如何调用它的函数 期待DLL2?我在猜 插件框架需要提供 就像是 GetPluginFuncAddr(plugin_ID,func_ID) [...]
是的,您可以公开这样的函数,或者提供对某种全局可访问的注册表的访问。同样,我建议包括版本控制,因此插件可以选择询问已知可以工作的特定版本的函数,允许更新而不破坏现有插件。
插件和功能应该如何 确定了吗?字符串与GUID,或者是 这是一个简单的事情,因为一个插件 应该只提供标题?
请参阅,如果您正在使用其他插件的功能/功能开发插件,您可能不希望每次编写插件时都执行插件加载,版本/兼容性检查和错误处理,相反,您需要可能希望链接到为您做样板操作的存根。至于你如何实现插件和功能识别真的取决于你。在识别插件时(以及用户友好的,可读的名称和描述),GUID肯定不是一个坏主意,除此之外,您可以提供不同功能版本的列表/树,即
UsefulPlugin@{1e2f253e-a3b2-4617-90f2-f323577ffddf}
|
\__ FunctionA
| |
| \_ v1.1
| |
| \_ v1.3
|
\__ FunctionB
|
\_ v1.0
...哪些客户可以查询所需信息。如果需要,您甚至可以提供反射信息,提供有关函数的参数,返回值等的信息。