我正在开发和维护一组用作主机应用程序插件的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。
就是说,我想再次强调,我正在寻找一种通用的设计来解决该问题,而不是针对特定的代码。
感谢您的帮助!
最佳答案
请记住,每个使用您的DLL的程序都有其自己的地址空间,因此无法使用普通内存(与特殊的OS提供的共享内存相对)进行交互。获得不同进程的最佳方法是让您的DLL启动一个单独的进程来计数共享资源。然后,您将需要实现某种(本地)套接字API,以允许共享数据。
关于c++ - 独立DLL之间的进程间通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19703842/