README.testing表示
然后"demo"将使用插件。呼叫
- 使用dlsym((例程检索对动态库中符号的访问
插件。Call是唯一一个调用dlsym的子程序。现在:
- grep找不到"呼叫";在插件源之外的任何源文件中
- 放置在Call末尾的Put_Line永远不会产生任何输出
- 放置在插件末尾的Put_Line。Load产生输出,所以我正在摸索正确的包(plugins_unix.adb(
简而言之:它有效,但我不知道为什么。如何在不使用dlsym的情况下调用在运行时加载的库中的函数?
我终于理解了这个方案。
诀窍是主程序从不调用插件的函数!它只加载带有dlopen的插件(库(。
所有插件都是抽象基类型的派生,每个插件在其包体中声明了2个全局变量:
- 类范围类型之一(到基类型(
- 受控变量(Limited_controlled with null record(
相应的重写初始化过程:
- 调用构造函数并将结果分配给第一个变量
- 从引入这个新对象的主程序中调用一个注册子程序
主程序可以调用对象的所有方法,它从抽象基类型中知道这些方法。
简而言之,当库并且主程序的作用类似于"加载";我们不会给你打电话,给我们打电话;