如何使用包装类中定义的__declspec(dllexport)结构进行导出

How to export with __declspec(dllexport) struct defined in wrapped class?

本文关键字:结构 dllexport declspec 包装类 何使用 定义      更新时间:2023-10-16

是否可以在不包装的情况下导出包装类的结构(结构只包含枚举和基元)?假设我的包装看起来像这样:

WorkerWrapper.h

#ifdef TESTEXPORTDLL_EXPORTS
#define TESTEXPORTDLL_API __declspec(dllexport)
#else
#define TESTEXPORTDLL_API __declspec(dllimport)
#endif
class Worker;
struct JobTypeInfo;
template class TESTEXPORTDLL_API std::unique_ptr<Worker>;
class TESTEXPORTDLL_API WorkerWrapper {
private:
    std::unique_ptr<Worker> fWorker;
public:
  WorkerWrapper();
  ~WorkerWrapper();
  WorkerWrapper(WorkerWrapper&& aThat);
  WorkerWrapper& operator= (WorkerWrapper&& aThat);
  void DoJob(JobTypeInfo aTypeInfo);
};

WorkerWrapper.cpp是通过使用std::move来处理unique_ptr的规则实现的,这不是我提出问题的原因。Worker类在WorkerWrapper中是正向声明的,并且包含一个我要导出的结构。

Worker.h

struct JobTypeInfo
{
    typedef enum
    {
        DoThis,
        DoThat,
        DoNothing
    } CalcType;
    CalcType sCalcType;
    //... primitives
};
class Worker
{
public:
    void DoJob(JobTypeInfo aTypeInfo);
};

我在这里能做什么?

提前谢谢。

如果没有包含的方法,导出struct什么都不做——导出class意味着导出其所有方法,如果它包含vtable,则导出其typeinfo

以这种方式导出WorkerWrapper也是有问题的,因为不会导出std::unique_ptr<Worker>。如果您没有任何内联方法(包括默认实现),它会起作用,但MSVC会给您一个警告C4251。

请尝试仅传递接口指针。虚拟析构函数是可以的,因为它们调用正确的解除定位器。

我简单地通过将结构提取到它自己的头文件中来解决它。