我正在尝试使用公共类方法通过结构返回一些数据。结构体有简单的c'tors和无状态方法,有些甚至包含其他结构(尽管没有C ++ / STL类型)。类和结构将导出到DLL。
结构的整个定义包含在带有相应dllexport
或dllimport
修饰符的标题中,因为它们将由客户端使用,客户端也将拥有静态导入库。
摘录如下:
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 )