如何使用包装 class 中定义的 __declspec(dllexport) 结构导出?

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

是否可以在不包装的情况下导出包装的 class 的结构(结构仅包含枚举和原语)?假设我的包装器看起来像这样:

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 class 在 WorkerWrapper 中向前声明并包含一个我要导出的结构。

Worker.h

struct JobTypeInfo
{
    typedef enum
    {
        DoThis,
        DoThat,
        DoNothing
    } CalcType;
    CalcType sCalcType;

    //... primitives
};

class Worker
{
public:
    void DoJob(JobTypeInfo aTypeInfo);
};

我可以在这里做什么?

提前致谢。

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

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

尝试只传递一个接口指针。虚拟析构函数没问题,因为它们调用正确的释放器。

我只是通过将结构体提取到它自己的头文件中来解决它。