当初学了一下Windows动态连接库,之前一直没有用上,现在都忘光了!今天重新复习了一下,顺便做一下笔记!
动态连接库(Dynamic Link Library)的加载有两种方式,分别是隐式加载和显示加载。
隐示加载方式:
1. 隐式加载方式就是程序启动就将动态连接库的内存代码页面地址加载到程序的内存代码页面中。
2. 使用隐式加载方式进行编程时,程序项目需要包含(#param comment(lib,"library name"))一个和生成动态连接库时一起生成的静态库并在源代码中包含动库连接库原来的头文件。
(1 ) 如果程序项目没有包含动态库一起生成的静态库,程序生成连接将会失败,提示未定义用到连接库的内容。
3. 关于动态连接库中全局函数或类的声明:
(1 ) 全局函数在动态连接库项目中需要在声明时返回的类型前面加 _declspec(export) 以声明为库的导出函数(如:_declspec(export) int add(int fir,int sed)),定义中可以不加入_declspec(export);
(2 ) 要想导出动态连接库中的类声明形式为 : class _declspec(export) CClassName;
(3 ) 类可以只导出部分成员。类只导出部分成员时,类声明头class CClassName中不需要加入 _declspec(export),只对想导出的成员作和全局函数一样的声明便可。
(4 ) 执行程序项目中使用动态连接库的头文件出时 _declspec(export) 换成 _declspec(import) 或 extern 以告诉编译器这些函数是从外部导入的。 动库连接库建议使用_declspec(import) 以便生成更高效的可执行程序。
4. 因为C++的多态性,C++编译器会为源码中的原函数名进行改编。如果不想让编译器对原函数进行函数名改编的话可以使用限定符extern "C" 来限制编译器作名字改编。动态连接库的函数使用例如: extern "C" _declspec(export) int add(int fst,int sed);类声明如: class extern "C" _declspec(export) CClassName;
显示加载方式: