独立 DLL 之间的内部进程通信

Innerprocess communication between independent DLLs

本文关键字:进程 通信 内部 DLL 之间 独立      更新时间:2023-10-16

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

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

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

一个

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

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

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

更多信息和问题解答:

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

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

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

感谢您的任何帮助!

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

你可以

使用Qt-实际上是QtCore-,Gtk - 实际上是它的Glib(也许通过Gtkmm,这是它们上面的C++胶水),Poco,或者可能是Apache可移植运行时

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

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

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