问题:通常我们在dll中要导出一个类都是直接在导出头文件声明该类的方法及属性,这样一来别人只要拿到我们的导出头文件便可以由此猜测出很多实现方面的信息。
安全的做法:使用虚类,导出头文件中只保留虚类,将需要导出的函数放在虚类中而并无其他信息,然后在在其他文件中继承并实现虚类的方法,而将类指针作为接口输出。
具体实现例子:
导出头文件.h
#ifdef _EXPORT
#define DLLMODULETYPE __declspec(dllexport)
#else
#define DLLMODULETYPE __declspec(dllimport)
#endif
class CBase //虚类
{
public:
virtual void test() = 0; //需要导出的方法虚函数
};
extern "C" DLLMODULETYPE CBase* _stdcall ExportCall(); //导出接口函数
继承并实现虚类的文件.h
class CMyClass:public CBase
{
public:
CMyClass(void);
~CMyClass(void);
virtual void tRead(); //实现虚函数
};
继承并实现虚类的文件.cpp
void CMyClass::tRead()
{
printf("sucessful!\n");
}
CBase* _stdcall exportcall() //导出函数的实现
{
return new CMyClass;
}
这样,使用者的可见类就只有虚类CBase而看不到实现类CMyClass