在DLL导出的类方法中按值返回结构 - 是否安全?

时间:2013-10-19 11:16:56

标签: c++ dll struct

我正在尝试使用公共类方法通过结构返回一些数据。结构体有简单的c'tors和无状态方法,有些甚至包含其他结构(尽管没有C ++ / STL类型)。类和结构将导出到DLL。

结构的整个定义包含在带有相应dllexportdllimport修饰符的标题中,因为它们将由客户端使用,客户端也将拥有静态导入库。

摘录如下:

struct __declspec(dllexport) Data
{
    double dataA;
    double dataB;

    Data(double _a, double _b) : dataA(_a), dataB(_b) {}
    double helperMethod(double param1, double param2) { return dataA + dataB; }
};

struct __declspec(dllexport) AggData
{
    double dataX;
    double dataY;
    Data aStructData;

    AggData(double _x, double _y) : dataX(_x), dataY(_y), aStructData(0.0, 0.0) {}
    double helperMethod(double param1, double param2) { return dataX + dataY; }
};

class __declspec(dllexport) IModel
{
public:
    virtual Data returnSomeData() = 0;
    virtual AggData returnSomeOtherData() = 0;
};

class __declspec(dllexport) Model : public IModel
{
public:
    Data returnSomeData();
    AggData returnSomeOtherData();
};

我的主要问题是:标头和导入库是否保证客户端可以按预期使用我的类,即ABI问题导致数据没有损坏?

这个问题及其答案似乎与我正在寻找的一致,但没有提到导入库是否可以解决虚函数问题:
Passing struct by value from an explicitly loaded dll built with a different compiler

相关问题:如果我只分发没有导入库的标头,并假设没有虚函数,那么它是否足以使用?我认为这只是一个关于编译器结构内存布局的问题,但我也不清楚它。

阅读这些其他问题,但没有看到答案(或者没有意识到,如果我看到一个):
C++ define class member struct and return it in a member function
How to export/import a C struct from a DLL/ to a console application using __declspec( dllexport/import )

0 个答案:

没有答案