最近项目进行到一定阶段,老板要求把已完成部分分离开并把各模块封装成dll。用vs开发dll当然很简单,是用vs的向导可以很快写一个dll.但是我遇到了一些问题:刚开始只需要把各个模块的头文件和cpp加入到一个新的dll工程,然后又把导出类的成员函数和成员变量用到的结构体类型、类类型定义的头文件加进来,编译后dll就写出来了。问题是当我要使用这个dll时我就得把所有的相关头文件包含到引用dll的工程中。这样显然违背的我写dll的初衷。我认为我写dll的目的主要有两个:一是封装性。我不希望将我算法细节暴露给使用dll的人。因此我想把导出类引用的一些特殊类型(指的是除了简单类型之外的结构体或者类类型)的私有成员隐藏起来,这样就需要把那些头文件还有引用头文件的define语句也隐藏。二是易用性。把我这些dll给别人用时要让他们用起来很方便。如果不加修改的把现在的东西给他们用时需要他们先来熟悉这些特殊类型的定义,比如这些类型数据的初始化等等。而且我的dll引用到的头文件有好几个,而这些头文件又引用了其他头文件。也就是说如果直接提供一个dll我同时还用提供10多个头文件。
在网上我查了很多地方,总结别人的经验,总算把自己的dll封装好了。
废话一大堆,现在说说我是怎么做的吧。
现在我有一个导出类BClass,他的成员函数的参数类型和私有成员变量类型都被很多其他头文件所定义,网上提供的一个解决办法是把头文件的define引用语句放到对应的cpp中,这当然是必须的,但是仅仅这样做我们在导出类中使用这些特殊类型的变量只能使用指针。这一点是和dll的特性有关的,原因在于dll只在运行时才被程序加载,在编译时我们无法知道cpp引用头文件里定义的类型。这样如果不使用指针类型变量,由于我们不知道那些类型的变量的大小,在编译时就会报错。所以我们必须把那些非指针型特殊变量改成指针类型。可是如果我们不想这样改的话呢?另外还有缺点就是这样仍然可以让别人知道