在DLL

时间:2017-06-29 09:10:13

标签: c++ vector dll

所以我有一个引用DLL的主程序(在单独的解决方案中)。这是设计代码:

//.h of DLL

#ifdef DLL_PREPRO
    #define DLL_LINK __declspec(dllexport)
#else
    #define DLL_LINK __declspec(dllimport)
#endif

enum MyID
{
    //values here....
}

DLL_LINK class MyCustomClass
{
public:
    MyID id;
    LPCTSTR lpszApp;
    LPCTSTR lpszKey;
    LPCTSTR lpszDefault;
    CString& strData;
}

static vector<MyCustomClass> m_customClass; //the vector in question

DLL_LINK void InitTables();

//I have other custom classes that has almost similar structure to this, and with their corresponding vector
//on the .cpp is the implementation of function InitTables() that is called by the EXE side wherein I am doing some processing on the vectors

//.cpp on the EXE side

void AddCustomClass(MyCustomClass c)
{
    (&m_customClass)->push_back(c);
}

//I have another method here who populates the vector by calling AddCustomClass repeatedly

我的问题是在调试期间,在exe端我看到矢量被填充(我这样做是通过&#39;添加到观察&#39; - 每个矢量),但当我跳过(F10)到dll侧的InitTables函数,所有向量现在包含0个元素。 顺便说一句,我将dll的cpp文件拖到exe解决方案上,以便能够设置断点。 由于使用空元素访问这些向量会引发错误,因此我暂时在InitTables()函数之上放置了一个返回值。然后,当我再次将再次返回到exe解决方案中的下一行时,所有向量现在都返回

所以我的问题是,设计/源代码有什么问题,应该如何纠正?谢谢!

2 个答案:

答案 0 :(得分:2)

问题是你在头文件中使用了keywork static:

static vector<MyCustomClass> m_customClass; //the vector in question

在此上下文中,static表示:此符号仅在当前单位中可见。 因此,包含此头文件的每个.cpp文件都有自己的全局变量实例!实际上,您可以拥有此变量的10个实例。

可能你想要这样的东西:

extern DLL_LINK vector<MyCustomClass> m_customClass;

在相应的.cpp文件中添加:

vector<MyCustomClass> m_customClass;

答案 1 :(得分:0)

命名空间范围变量上的static说明符给出了变量 internal 链接。换句话说,这意味着每个.cpp文件都有自己的变量副本。显然不是你想要的。如果您希望在DLL中定义变量但是从EXE访问该变量,那么它实际上必须是extern(并导出),而不是static