如何使用包装 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.
尝试只传递一个接口指针。虚拟析构函数没问题,因为它们调用正确的释放器。
我只是通过将结构体提取到它自己的头文件中来解决它。
是否可以在不包装的情况下导出包装的 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.
尝试只传递一个接口指针。虚拟析构函数没问题,因为它们调用正确的释放器。
我只是通过将结构体提取到它自己的头文件中来解决它。