GNAT示例/插件:没有dlsym()的lib函数调用



README.testing表示

然后"demo"将使用插件。呼叫

  1. 使用dlsym((例程检索对动态库中符号的访问

插件。Call是唯一一个调用dlsym的子程序。现在:

  • grep找不到"呼叫";在插件源之外的任何源文件中
  • 放置在Call末尾的Put_Line永远不会产生任何输出
  • 放置在插件末尾的Put_Line。Load产生输出,所以我正在摸索正确的包(plugins_unix.adb(

简而言之:它有效,但我不知道为什么。如何在不使用dlsym的情况下调用在运行时加载的库中的函数?

我终于理解了这个方案。

诀窍是主程序从不调用插件的函数!它只加载带有dlopen的插件(库(。

所有插件都是抽象基类型的派生,每个插件在其包体中声明了2个全局变量:

  1. 类范围类型之一(到基类型(
  2. 受控变量(Limited_controlled with null record(

相应的重写初始化过程:

  1. 调用构造函数并将结果分配给第一个变量
  2. 从引入这个新对象的主程序中调用一个注册子程序

主程序可以调用对象的所有方法,它从抽象基类型中知道这些方法。

简而言之,当库并且主程序的作用类似于"加载";我们不会给你打电话,给我们打电话;

最新更新