【问题标题】:How do you expose functionality to a plugin library?如何向插件库公开功能?
【发布时间】:2011-12-24 05:12:42
【问题描述】:

如果我有一个程序 foo.exe 并在运行时加载插件 bar.dll,我如何让 bar.dll 中的代码使用 foo.exe 中的类? bar.dll 是否可以从 foo.exe 派生类?另外,这个解决方案会是跨平台的吗?

编辑:这是我正在尝试做的更多事情:


//foo.exe
class Node {
public:
    void SetName(const string& n) { ... }
    const string& GetName() { ... }
};

//bar.dll
class TransformNode : public Node {
public:
    void DoSomething() {
        SetName(...);   //basically, can I inherit functionality from foo.exe (SetName and GetName) 
                        //and reuse the code in a derived class in bar.dll?
    }
};

【问题讨论】:

    标签: c++ dll dynamic-linking


    【解决方案1】:

    为了让 bar.dll 使用 foo.exe 中的类,您需要将具有虚函数的类的实例从 foo.exe 传递给 bar.dll。 Bar.dll 会调用来自 foo.exe 的虚函数。


    是的,bar.dll 可以将派生类传回给 foo.exe,然后让 foo.exe 调用这些类的虚函数。


    此解决方案将是跨平台的,但您将遇到重大问题,以确保您不会破坏共享库和 exe 之间的 abi。即使是最简单的更改也很容易破坏 abi。

    This 很好地介绍了什么可以破坏 abi。

    【讨论】:

      【解决方案2】:

      通常我在开发插件的时候,一般都会提供一个插件创建者可以依赖的接口。

      通过这个接口,插件可以访问我允许它查看和交互的对象和类。

      【讨论】:

      • 接口是指纯虚类,还是可以包含一些带有实现的函数?
      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多