我正在开发和维护一组用作主机应用程序插件的 DLL。主机应用程序有一个插件 API,我的插件实现了它。主机应用程序是由另一家公司开发的,我无法控制插件的使用方式:主机应用程序可能随时以任何顺序加载/卸载任何插件。插件可以在任何线程中运行,也可以从不同的线程中调用。
我需要一种方法让这些插件插件共享一个公共资源。此资源应由加载的第一个插件初始化,并由卸载的最后一个插件初始化。第一个和最后一个可能是不同的插件。线程安全是一个重要问题。
您可以将其视为在所有当前加载的插件之间共享的单例。
一个可能的解决方案可能是我的所有插件都将共享一个公共 DLL,该 DLL 将在加载时初始化单例,并在卸载时销毁它。但是,如果可能的话,我希望我的插件是独立的,以简化在用户机器上的部署。
因为主机应用程序是跨平台的,所以解决方案应该是跨平台的,并且在 Windows、Mac OS 和 Linux 上以相同的方式工作(如果可能的话)。为此,我查看了 boost,但对 boost 进程间代码中的类和选项的数量感到不知所措。
我不要求一个完整的编码解决方案,而是关于解决这个问题的最佳方法的建议。
更多信息和问题解答:
这里的问题是我不能期望主机应用程序有任何帮助,所以它是什么并不重要。实际上有一些应用程序使用插件,所以我不能依赖任何单个应用程序的任何特定功能。我可以说宿主应用程序是一个普通的桌面应用程序,例如 Windows 上的普通旧 .exe,Mac OS 上的 .app。没有 iOS 或 Andriod 应用程序。
插件接口是主机可以调用的一组函数。API是一种方式:主机可以调用插件,但插件不能调用主机。每个插件都有一个初始化函数,主机必须在加载时调用一个初始化函数,以及在卸载 DLL 之前主机必须调用一次的未初始化函数。
插件是用 C++ 实现的,但不是 C++11。编译器是 Windows 上的 VisualStudio 2005 和 Mac 上带有 gcc 4.2.1 的 Xcode 3.2。也就是说,我想再次强调,我正在寻找一种通用设计来解决该问题,而不是针对特定代码。
感谢您的帮助!