所以我有一个引用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解决方案中的下一行时,所有向量现在都返回。
所以我的问题是,设计/源代码有什么问题,应该如何纠正?谢谢!
答案 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
。