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

时间:2012-04-10 00:07:41

标签: plugins dll window

我正在处理各种插件协议。我们的想法是,有一个基本的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->黑/白运算符 - 是的,这些将是图形插件,并忽略输入/输出缓冲区的类型..它们只是占位符点。

#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 ++最有意义的是在类中封装这些数据(这是关于作为工厂本身的类),无论是通过成员还是方法

1 个答案:

答案 0 :(得分:0)

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

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