结论如下:
1、 DLL之间调用类public静态成员变量,不能使用A::m_static形式调用,其中A为类名,m_static为A中的static成员变量。若使用,编译出现链接错误,必须使用函数调用方式,为m_static增加set/get函数。
2、 对于模板类,VS2005编译器不支持将函数放入CPP文件之中,若放入CPP中,将产生链接错误。
3、 模板静态成员变量的初始化,可以放在.H文件之中。
4、 对于模板单例类,若两个平行DLL同时调用,模型如图1.1:
图1.1 层次结构
对于以上结构,若DLL A与DLL B中,对同一个类的单例都进行实例化调用。则DLL A与DLL B中将对模板类分别进行实例化,从而获取的指针是不同的值。
为了避免类似情况发生,可以在需要实例化类同一个头文件中,加入全局函数,保证实例化在类定义同一个模块中:
- /** @brief 需要实例化类 */
- class AFX_EXT_CLASS LAYER
- {
- public:
- LAYER(void);
- ~LAYER(void);
- }
- /** @brief 获取单例指针 */
- extern AFX_EXT_API WMemoryFactory<LAYER>* WINAPI AfxGetFactoryLayer();
从而在需要访问指针时,调用AfxGetFactoryLayer()函数进行访问,保证实例化是在同一个DLL之中。
若以上代码在DLL A中,在DLL B中利用单例GetInstance()函数获取指针,与使用函数AfxGetFactoryLayer()返回指针也不相同。但调用DLL A的DLL则可以获取相同指针。