Plugins DLL中的导出函数是否可以返回导出类的静态成员?

Plugins DLL中的导出函数是否可以返回导出类的静态成员?,plugins,dll,window,Plugins,Dll,Window,我正在研究一种插件协议。其思想是有一个基类PCOperatorBase,插件将对这个基类进行子类化,通过它们重写的“进程”虚拟方法提供特定的功能。子类还应该有一个静态结构成员,其中包含典型的插件信息:插件名称、类型和子类型。另一个类(PCOperatorManager)使用此信息来了解插件的类型。我考虑让它成为一个静态成员,这样就不需要实例化一个插件来仅仅了解它是什么类型的操作符 我有以下课程: PCOperatorBase.h从中派生所有其他插头的超类: #ifdef PCOPERATORBA

我正在研究一种插件协议。其思想是有一个基类PCOperatorBase,插件将对这个基类进行子类化,通过它们重写的“进程”虚拟方法提供特定的功能。子类还应该有一个静态结构成员,其中包含典型的插件信息:插件名称、类型和子类型。另一个类(PCOperatorManager)使用此信息来了解插件的类型。我考虑让它成为一个静态成员,这样就不需要实例化一个插件来仅仅了解它是什么类型的操作符

我有以下课程:

PCOperatorBase.h从中派生所有其他插头的超类:

#ifdef PCOPERATORBASE_EXPORTS
#define PCOPERATORBASE_API __declspec(dllexport)
#else
#define PCOPERATORBASE_API __declspec(dllimport)
#endif

class PCOPERATORBASE_API PCOperatorBase
{
public:

    typedef struct OperatorInfo
    {
        wchar_t* name;
        wchar_t* type;
        wchar_t* subtype;
    } OperatorInfo;

    PCOperatorBase(void);
    virtual ~PCOperatorBase(void);
    virtual int process(int* inBuffer, int* outBuffer, int bufferSize);
};
然后,例如,一个子类: BlackNWhite.h:RGB->black/white操作符——是的,这些将是图形插头,不考虑输入/输出缓冲区的类型。。在这一点上,它们只是占位符

#ifdef BLACKNWHITE_EXPORTS
#define BLACKNWHITE_API __declspec(dllexport)
#else
#define BLACKNWHITE_API __declspec(dllimport)
#endif

// This class is exported from the BlackNWhite.dll
class BLACKNWHITE_API CBlackNWhite : PCOperatorBase 
{
public:
    static PCOperatorBase::OperatorInfo* operatorInfo;

    CBlackNWhite(void);
    virtual ~CBlackNWhite(void);
    //virtual int process(int* inBuffer, int* outBuffer, int bufferSize);

};


BLACKNWHITE_API CBlackNWhite* getOperatorInstance();
BLACKNWHITE_API const PCOperatorBase::OperatorInfo* getOperatorInfo();
这里是实现文件: BlackNWhite.cpp:

#include "stdafx.h"
#include "BlackNWhite.h"

BLACKNWHITE_API CBlackNWhite* getOperatorInstance()
{
    return new CBlackNWhite();
}

BLACKNWHITE_API const PCOperatorBase::OperatorInfo* getOperatorInfo()
{
    return CBlackNWhite::operatorInfo;
}


CBlackNWhite::CBlackNWhite()
{
}

CBlackNWhite::~CBlackNWhite()
{
}
现在,我尝试了几种方法,但由于静态成员的原因,我无法编译DLL。链接器抛出:

\BlackNWhite.lib and object c:\Projects\BlackNWhite\Debug\BlackNWhite.exp
1>BlackNWhite.obj : error LNK2001: unresolved external symbol "public: static struct PCOperatorBase::OperatorInfo * CBlackNWhite::operatorInfo" (?operatorInfo@CBlackNWhite@@2PAUOperatorInfo@PCOperatorBase@@A)
1>c:\Projects\BlackNWhite\Debug\BlackNWhite.dll : fatal error LNK1120: 1 unresolved externals
我认为,由于结构是在基类内部定义的,并且基类正在导出,因此结构也会导出。但我猜我错了

那么我应该怎么做呢?


无论如何,有没有比静态类成员(例如,资源文件)更好的方法让插件的工厂在不需要实例化的情况下导出其名称、类型和子类型?或者,甚至另一个外部“C”函数也可以返回此信息。。但是我觉得,因为C++,所以在这个类中封装这个数据(这是关于工厂本身的)是最有意义的,无论是通过成员还是方法。

< p>它与DLL没有任何关系,你声明了静态成员,但是你忘记了定义它。将此行添加到BlackNWhite.cpp:

PCOperatorBase::OperatorInfo* CBlackNWhite::operatorInfo = NULL;

这很有效。但这不是对成员的重新声明吗,意思是类型id=rval(声明+初始化)?按照我的想法,声明是在接口中完成的(不管是静态的还是在.h中)。我不记得需要在实现中重述类型…除了这个特殊情况之外。。。如何“强制”子类为每个子类实现此结构的静态成员?意思是,我想建立一些子类需要实现的接口(协议,如果你愿意的话..Objective-C心态)。我曾考虑在基类中包含静态成员,但这没有意义,因为所有子类都将共享相同的operatorInfo。我需要强制每个子类实现一个唯一的子类