独立DLL之间的进程间通信

时间:2013-10-31 10:21:58

标签: c++ boost plugins singleton cross-platform

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

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

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

一个可能的解决方案可能是我的所有插件都将共享一个公共DLL,它将在加载时初始化单例并在卸载时销毁它。 但是,如果可能的话,我希望自己的插件能够自行包含,以便在用户的计算机上轻松部署。

由于主机应用程序是跨平台的,因此该解决方案应该是跨平台的,并且在Windows,Mac OS和Linux上以相同的方式工作(如果可能的话)。为此,我查看了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 个答案:

答案 0 :(得分:1)

您可以使用Qt - 实际QtCore-,Gtk - 实际上它的Glib(可能通过Gtkmm这是他们上面的C ++粘合剂)和Poco,或者也许Apache Portable Runtime

所有这些都是免费软件,具有强大IPC和多线程(和插件)功能的跨平台框架。

除非您更多地了解您的(第三方)主机应用程序,其插件界面和您自己的插件,否则我们无法提供更多帮助。也许主机应用程序已经提供了一些可移植的方法来进行进程间通信,或线程安全的单例...(这就是为什么你应该告诉我们更多关于该主机应用程序的原因;它可能使用,或者至少提供一些交叉-platform库或API,就像我列出的那样。)

也许使用C++11可能有所帮助。我想你想要一些singleton pattern

答案 1 :(得分:1)

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