动态链接库(DLL)编写经验

我首先说明DLL的生成方法,之后再补充一些特殊之处。
生成方法:
1.对需要导出的类,在头文件中添加

#ifdef CLASS _API
#define CLASS_API _declspec(dllexport )
#else
#define CLASS_API _declspec(dllimport )
#endif

2.在其cpp文件中添加
#define CLASS_API _declspec(dllexport )
注意这条语句一定要放在头文件链接的前面

3.在类声明添加 CLASS_API,如:
class CLASS_API Class1

添加完以上编译命令后运行得到的文件在debug文件夹中,但注意有用的是后缀名为dll与lib的两个文件,以及类的头文件。将这三个文件拷贝在需要使用该动态链接库的目录下。然后在解决方案中添加lib文件和头文件,dll文件只需要拷贝在工程目录下而并不需要添加在解决方案中。然后直接调用就可以。

再补充说明一些特殊的地方:
1.一个动态链接库可以同时导出多个类,但注意每个类都要按照以上的生成方法处理。当然在使用时每个类的头文件也都要拷贝在工程目录之下;
2.根据实验dll文件的生成必须在win32控制台应用程序的DLL项目中,单纯的控制台应用程序即使添加了上述代码也不能生成dll文件,只是多生成了lib文件。而没有dll文件是无法运行
3.一旦选择了dll链接库项目,至于类声明是_declspec (dllexport )还是_declspec (dllimport ),似乎并没有影响,运行结果一致且都成功。按理说类声明在编写时应该为_declspec (dllexport ) 。但可能是项目本身的编译设置忽略的这点差异,只要类是声明为dll相关的都会导出到dll文件中。当然如果两个声明语句都没有自然是无法导出的。
4.在多个类嵌套的情况下要特别注意最终导出的类的封装。例如最终要导出的类继承了其他的类,或者调用了其他的类的方法。这些都是可以的,只是在头文件的声明中不要出现相关的类名。而是一定要完整的封装在底层。否则,在将头文件拷贝至工程目录下时就会出现“标识符未定义”的错误。这样就必须调用相关的头文件,这样就违背了dll 的设计简化的理念。

posted @ 2017-11-20 21:32  上官栋  阅读(795)  评论(0编辑  收藏  举报