0

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

提前致谢,

干杯

4

4 回答 4

1

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

于 2010-07-29T09:02:28.647 回答
1

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

您可以在多个项目(“项目”是您的主应用程序或您的插件之一)之间共享和使用文件(此处为“头文件”)。在您的情况下,它实际上非常有意义。

于 2010-07-29T09:03:18.270 回答
0

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

问题:“在哪里放置接口” 答:在您的“公共”API 文件夹中。

于 2010-07-29T09:03:23.763 回答
0

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

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

不确定您将如何在 C++ 中完成此操作,我想您可以为插件接口创建一个单独的 dll 并从您的 exe 和插件 dll 加载它。

希望有帮助。

于 2010-07-29T09:05:24.383 回答