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