插件模式与.dll。如何从dll中提取插件接口?

时间:2010-07-29 08:57:03

标签: c++ design-patterns dll plugin-pattern

我有一个应用程序,假设在插件模式中实现 插件位于dll文件中,我正在动态加载它们,具体取决于用户通过命令行提供的参数。也就是说,如果用户想要使用plugin1,他在运行应用程序时会在命令行中输入该名称作为参数,我应该在运行中加载它。
由于我使用插件模式,我有一个接口(因为在c ++中工作它是一个抽象类),所有插件类都实现。
我的困境是在哪里放置接口类?为了构建dll,我必须在每个dll中都有一个接口声明。
我希望在需要更改界面时避免更改所有dll中的界面 另一方面,如果我在主应用程序中声明接口类,我的dll将不会被编译和构建? 你是否有关于如何从dll中提取接口类并将其放在主应用程序中的建议,所以当我想更改它的代码时,不需要在十几个地方(即每个dll中)更改它)。

提前致谢,

干杯

4 个答案:

答案 0 :(得分:1)

您必须将接口定义存储在一个公共位置(在\ say子目录中单独的.h文件中),并且您必须在更改接口后重新编译所有库。在C ++中没有办法解决这个问题。如果你需要能够唯一地识别接口,你可以使用类似COM的东西,并在每次破坏接口时更改接口ID(同样,你将不得不重新编译实现,但是使用COM,客户端不会因为DLL地狱而遇到未定义的行为)。

答案 1 :(得分:1)

如果你通过“interface”谈论描述你的基本抽象类的头文件,我认为没有真正的问题。

您可以在多个项目中共享和使用文件(此处为“头文件”)(“项目”是您的主应用程序或其中一个插件)。在你的情况下,它实际上是完全合理的。

答案 2 :(得分:0)

每个DLL都需要具有相同的导出函数,该函数返回指向您的接口的指针。每个DLL都应该负责实例化“接口”(实际上是真正的子类)。 因此主应用程序将出现,在DLL上调用LoadLibrary,然后使用GetProcAddress,将调用DLL上的导出函数。然后,导出的函数应实例化具体接口并返回指向它的指针。

问题: “在哪里放置界面” 回答: 在“公开”API文件夹中。

答案 3 :(得分:0)

我曾经在C#中做过这个,但也许它可以帮到你。我在一个单独的项目中创建了一个接口和抽象类,主应用程序和插件引用它。这样,如果有必要,只有一个地方可供编辑。

Main App.exe< - > PluginInterface.dll< - > APlugin.dll

不确定如何在C ++中实现这一点,我猜你可以为插件界面创建一个单独的dll,并从你的exe和你的插件dll中加载它。

希望有所帮助。