【问题标题】:Making objects shared across DLL's使对象在 DLL 之间共享
【发布时间】:2015-02-20 06:14:46
【问题描述】:

我用 DLL(或 .so,它是跨平台的)编写了一个模块化系统。这些单独的插件必须挂接到主系统的对象中。

例如 您在一个对象中有一个字符串向量,所有者是主要应用程序。现在有几个(显式加载的)插件必须访问该向量。

这些插件还需要一个基类,一种与主系统挂钩的 API。

我尝试将所有头文件都包含在 DLL 中,但这样做有两个问题:我每次构建插件时都包含 API。 第二个是:对于静态方法,我需要一个cpp文件,但是他没有使用主应用程序中的cpp文件,而是他自己的。这会导致该共享向量出现问题...(因为现在有多个向量,一个主向量,每个插件一个)

有什么想法吗?

【问题讨论】:

  • You have a vector of strings in one object, the owner is the main application. Now several (explicit loaded) plugins must access that vector. 如果我使用与主 DLL 不同的编译器或不同的编译器选项构建插件,则程序在访问此向量时可能会崩溃。

标签: c++ dll plugins


【解决方案1】:

正如保罗所说,这有点问题。当访问在另一个模块(exe/dll)中实例化的向量(可能您正在谈论 std::vector)时,您必须小心。如果两个模块都使用相同的编译器、相同的编译器设置、相同的 STL 实现编译并且您只是从中读取(尤其是不推送其他值,因为这可能会重新分配内部缓冲区并在访问内存时导致问题),您应该没事。

但是,如果您不能保证这样的设置,最好提供对原始数据数组及其大小的访问,而不是直接通过 std::vector,而是通过std::vector::data()。如果存储的数据类型(std::vector 的模板类型 T)在两个通信模块之间是二进制兼容的,那么这样的接口应该是安全的。

有一个解决此类问题的 C++ 标准提案:Defining a Portable C++ ABI。希望以后能避免此类问题。

【讨论】:

  • 这是一个添加列表的问题,但预防胜于治疗...但我的问题仍然存在:如何通过 dll 访问该向量?
  • 我的建议是不要访问向量,而是访问其内部数据数组(用于读取)。如果您需要更改矢量内容,则可能应该通过外部方法完成,该方法访问内部的矢量。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2012-07-22
  • 2012-08-18
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多