如何向插件库公开功能?

时间:2011-12-24 05:12:42

标签: c++ dll dynamic-linking

如果我有一个程序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?
    }
};

2 个答案:

答案 0 :(得分:2)

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


是的,bar.dll可以将派生的clases传递回foo.exe,然后让foo.exe调用所述类的虚函数。


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

This是打破abi的好介绍。

答案 1 :(得分:1)

通常在开发插件时,我通常会提供插件创建者可以依赖的界面。

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