高难度动态链接库问题

fietiger 2008-07-16 08:24:38
问题是这样的,我先写了一个类,里面有很多的静态成员变量和静态成员函数,这个类在我的第一个dll里面了。然后在第二个dll里面我要派生这个类。第二个类里面也是一些静态成员。最后我要在另外一个程序里面用这两个dll,现在的问题是那些静态成员变量要怎么声明。举例如下:

/// lib1.h
class AFX_EXT_CLASS CLib1Class
{
public:
static void Init();
CLib1Class();
virtual ~CLib1Class();

static double* m_pFKMenu;
static double m_dV;

static CString m_strCtrlName;

};

//lib1.c


AFX_EXT_DATA CString CLib1Class::m_strCtrlName;
AFX_EXT_DATA double* CLib1Class::m_pFKMenu = NULL;
AFX_EXT_DATA double CLib1Class::m_dV = 0.0f;


CLib1Class::CLib1Class()
{

}

CLib1Class::~CLib1Class()
{

}

void CLib1Class::Init()
{
m_pFKMenu = new double(160.7);
m_dV = 10.2;
}
///lib2.h
class AFX_EXT_CLASS CLib2Class : public CLib1Class
{
public:
static void FK();
CLib2Class();
virtual ~CLib2Class();
};
//lib2.c
CLib2Class::CLib2Class()
{
}

CLib2Class::~CLib2Class()
{

}

void CLib2Class::FK()
{
if (CLib2Class::m_pFKMenu==NULL)
{
AfxMessageBox("Help me,please!");

}

}
//测试代码
CLib1Class::Init();
CString Mag;
Mag.Format("%.6f",CLib1Class::m_dV);
MessageBox(Mag);
Mag.Format("%.6f",CLib2Class::m_dV);
MessageBox(Mag);
if (CLib1Class::m_pFKMenu == NULL)
{
MessageBox("Fark U ag!");
CLib1Class::m_pFKMenu = new double(10.2);
Mag.Format("%.6f",*CLib2Class::m_pFKMenu);
MessageBox(Mag);

}else{
Mag.Format("%.6f",*CLib2Class::m_pFKMenu);
MessageBox(Mag);
}
CLib2Class::FK();
Mag.Format("%.6f",*CLib2Class::m_pFKMenu);
MessageBox(Mag);
如果没有中间的那个动态链接库第一个声明是正确的,现在有了第二个动态链接库发现很麻烦。一直也没有想到合适的方法来。个人认为其难度在于要在第二个库里面要有声明,同时还得是引用的第一个库里面的。
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fietiger 2008-07-17
  • 打赏
  • 举报
回复
在上述的测试代码中执行过CLib1Class::Init();{函数里面对类的静态成员进行了初始化}然后再调用CLib2Class::FK(); 在这里访问了类的静态成员,可是发现呢它们并没有初始化。呵呵,这个问题已经解决了,参考如下:

6.4 MFC扩展DLL加载MFC扩展DLL

我们可以在MFC扩展DLL中再次使用MFC扩展DLL,但是,由于在两个DLL中对于AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA宏的定义都是输出,这会导致调用的时候出现问题。

我们将会在调用MFC扩展DLL的DLL中看到link错误:


error LNK2001: unresolved external symbol ….......
因此,在调用MFC扩展DLL的MFC扩展DLL中,在包含被调用DLL的头文件之前,需要临时重新定义AFX_EXT_CLASS的值。下面的例子显示了如何实现:


//临时改变宏的含义“输出”为“输入”

#undef AFX_EXT_CLASS
#undef AFX_EXT_API
#undef AFX_EXT_DATA
#define AFX_EXT_CLASS AFX_CLASS_IMPORT
#define AFX_EXT_API AFX_API_IMPORT
#define AFX_EXT_DATA AFX_DATA_IMPORT

//包含被调用MFC扩展DLL的头文件

#include "CalledDLL.h"

//恢复宏的含义为输出

#undef AFX_EXT_CLASS
#undef AFX_EXT_API
#undef AFX_EXT_DATA
#define AFX_EXT_CLASS AFX_CLASS_EXPORT
#define AFX_EXT_API AFX_API_EXPORT
#define AFX_EXT_DATA AFX_DATA_EXPORT

yjgx007 2008-07-16
  • 打赏
  • 举报
回复
mark.
cnzdgs 2008-07-16
  • 打赏
  • 举报
回复
在定义各个类的DLL中分别分配该类的静态变量,这样会有什么问题?

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧