0

我正在开发和维护一组用作主机应用程序插件的 DLL。主机应用程序有一个插件 API,我的插件实现了它。主机应用程序是由另一家公司开发的,我无法控制插件的使用方式:主机应用程序可能随时以任何顺序加载/卸载任何插件。插件可以在任何线程中运行,也可以从不同的线程中调用。

我需要一种方法让这些插件插件共享一个公共资源。此资源应由加载的第一个插件初始化,并由卸载的最后一个插件初始化。第一个和最后一个可能是不同的插件。线程安全是一个重要问题。

您可以将其视为在所有当前加载的插件之间共享的单例。

一个可能的解决方案可能是我的所有插件都将共享一个公共 DLL,该 DLL 将在加载时初始化单例,并在卸载时销毁它。但是,如果可能的话,我希望我的插件是独立的,以简化在用户机器上的部署。

因为主机应用程序是跨平台的,所以解决方案应该是跨平台的,并且在 Windows、Mac OS 和 Linux 上以相同的方式工作(如果可能的话)。为此,我查看了 boost,但对 boost 进程间代码中的类和选项的数量感到不知所措。

我不要求一个完整的编码解决方案,而是关于解决这个问题的最佳方法的建议。

更多信息和问题解答:

  1. 这里的问题是我不能期望主机应用程序有任何帮助,所以它是什么并不重要。实际上有一些应用程序使用插件,所以我不能依赖任何单个应用程序的任何特定功能。我可以说宿主应用程序是一个普通的桌面应用程序,例如 Windows 上的普通旧 .exe,Mac OS 上的 .app。没有 iOS 或 Andriod 应用程序。

  2. 插件接口是主机可以调用的一组函数。API是一种方式:主机可以调用插件,但插件不能调用主机。每个插件都有一个初始化函数,主机必须在加载时调用一个初始化函数,以及在卸载 DLL 之前主机必须调用一次的未初始化函数。

  3. 插件是用 C++ 实现的,但不是 C++11。编译器是 Windows 上的 VisualStudio 2005 和 Mac 上带有 gcc 4.2.1 的 Xcode 3.2。也就是说,我想再次强调,我正在寻找一种通用设计来解决该问题,而不是针对特定代码。

感谢您的帮助!

4

2 回答 2

1

您可以使用Qt -实际上是 QtCore-,Gtk -实际上是它的 Glib(也许通过 Gtkmm ,它是它们之上的 C++ 胶水)和Poco,或者可能是Apache Portable Runtime

它们都是免费软件,具有强大 IPC 和多线程(和插件)能力的跨平台框架。

除非您详细说明您的(第三方)主机应用程序、其插件接口和您自己的插件,否则我们无法提供更多帮助。也许宿主应用程序确实已经提供了一些可移植的方式来进行进程间通信或线程安全的单例......(这就是为什么你应该告诉我们更多关于宿主应用程序的信息;它可能使用或至少提供了一些交叉-platform 库或 API,如我列出的那些)。

也许使用C++11可能会有所帮助。我猜你想要一些单例模式

于 2013-10-31T10:30:02.547 回答
1

请记住,使用您的 DLL 的每个程序都有自己的地址空间,因此不能使用普通内存进行交互(与特殊的操作系统提供的共享内存相反)。获得不同进程的最佳方法是让您的 DLL 启动一个单独的进程来计算共享资源。然后,您将需要实现某种(本地)套接字 API,以允许共享数据。

于 2013-10-31T10:40:12.240 回答