二.动态库程序
  这篇写得比较乱,看不懂的可以跳part 2,直接上图片的。
 
动态库的使用:

4.3.1 隐式链接

 动态库的隐式连接,需要动态库的 动态库文件".dll" , 动态库的LIB文件".lib" , 动态库的函数引入声明

1)头文件和函数原型

可以在函数原型的定义前,增加declspec(dllimport), 例如

_declspec(dllimport)  int   FuncName( ... );

如果库函数使用C格式导出,需要在函数定义增加 extern “C”

2)导入动态库的LIB文件

 #pragma comment(lib,"libzmq-v100-mt-4_0_4.lib");    //第二个参数是LIB文件的名字,可带地址

3)在程序中使用函数,像普通函数一样正常使用就好。

4)隐式链接的情况,DLL可以存放的路径:

(1)与执行文件中同一个目录下

(2)当前工作目录

(3)Windows目录

(4)Windows/System32目录

(5)Windows/System

(6)环境变量PATH指定目录

注意:高版本VC的配置文件

4.3.2 显式链接

1)定义函数指针类型

2)加载动态库

HMODULE LoadLibrary(

LPCTSTR lpFileName  //动态库文件名或全路径

); 返回DLL的实例句柄(HINSTANCE)

3)获取函数地址

FARPROC GetProcAddress(

HMODULE hModule,    //DLL句柄

LPCSTR lpProcName   //函数名称

); 成功返回函数地址

4)使用函数

5)卸载动态库

BOOL FreeLibrary(

HMODULE hModule   //DLL的实例句柄

);

4.3.3 两种链接方式对比

1)在库函数的定义不变情况下:

隐式链接,由于库函数地址是在程序编译链接时设置,所以当动态库变化后,使用程序需要重新编译链接。

显式链接,由于库函数地址是在程序执行时,动态的从库中查询,所以库变化后,不需要重新编译链接。

2)动态库加载

隐式链接,动态库是在程序启动时就被加载,当DLL不存在,程序无法启动

显式链接,动态库只在使用LoadLibrary函数,才会被加载。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面是一些概述,我自己的笔记做得比较乱,只有自己才看得懂了。如果不想看的,可以直接看part 2的例子。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1.动态库特点

1)运行时独立存在

2)不会链接到执行程序

3)使用时加载

与静态库的比较:

1)由于静态库是将代码嵌入到使用程序中,多个程序使用时,会有多份代码,所以代码体积会增大。动态库的代码只需要存在一份,其他程序通过函数地址使用,所以代码体积小。

2)静态库发生变化后,新的代码需要重新链接嵌入到执行程序中。动态库发生变化后,如果库中函数的定义(或地址)未变化,其他使用DLL的程序不需重新链接。

2.动态库的创建

1 ) 建立项目

2 ) 添加库程序

3 ) 库程序导出 - 提供给使用者库中的函数等信息。

3.动态库的使用

3.1 隐式链接

3.2 显式链接

4.动态库的函数

4.1 实现动态库的函数

4.2 库函数的导出

1) C++的导出

使用 _declspec(dllexport) 导出函数

注意:动态库编译链接后,也会有LIB文件,是作为动态库函数映射使用,与静态库不完全相同。

2)C的导出方式     extern “C” _declspec(dllexport) int Sub(...);

3)模块定义文件 .def

例如:

LIBRARY DLLFunc //库

EXPORTS         //库导出表

DLL_Mul  @1  //导出的函数


4.3 库函数的使用

4.3.1 隐式链接

1)头文件和函数原型

可以在函数原型的定义前,增加declspec(dllimport), 例如

_declspec(dllimport)  int   FuncName( ... );

如果库函数使用C格式导出,需要在函数定义增加 extern “C”

2)导入动态库的LIB文件

 #pragma comment(lib,"libzmq-v100-mt-4_0_4.lib");    //第二个参数是LIB文件的名字,可带地址

3)在程序中使用函数,像普通函数一样正常使用就好。

4)隐式链接的情况,DLL可以存放的路径:

(1)与执行文件中同一个目录下

(2)当前工作目录

(3)Windows目录

(4)Windows/System32目录

(5)Windows/System

(6)环境变量PATH指定目录

注意:高版本VC的配置文件

4.3.2 显式链接

1)定义函数指针类型

2)加载动态库

HMODULE LoadLibrary(

LPCTSTR lpFileName  //动态库文件名或全路径

); 返回DLL的实例句柄(HINSTANCE)

3)获取函数地址

FARPROC GetProcAddress(

HMODULE hModule,    //DLL句柄

LPCSTR lpProcName   //函数名称

); 成功返回函数地址

4)使用函数

5)卸载动态库

BOOL FreeLibrary(

HMODULE hModule   //DLL的实例句柄

);

4.3.3 两种链接方式对比

1)在库函数的定义不变情况下:

隐式链接,由于库函数地址是在程序编译链接时设置,所以当动态库变化后,使用程序需要重新编译链接。

显式链接,由于库函数地址是在程序执行时,动态的从库中查询,所以库变化后,不需要重新编译链接。

2)动态库加载

隐式链接,动态库是在程序启动时就被加载,当DLL不存在,程序无法启动

显式链接,动态库只在使用LoadLibrary函数,才会被加载。


DLL中类的使用

1.DLL中类的导出

在类名称前增加 _declspec(dllexport) 定义,例如:

class _declspec(dllexport) CMath {

...

};

通常使用预编译开关切换类的导入导出定义,例如:

#ifdef DLLCLASS_EXPORTS

#define EXT_CLASS _declspec(dllexport)//DLL

#else

#define EXT_CLASS _declspec(dllimport)//使用者

#endif

class EXT_CLASS CMath{

...

};

2.使用DLL中的类

1 导入DLL的LIb

2 类的定义

3 使用类

3.动态库的程序入口

入口程序不是DLL必须的。常用于DLL内部初始化或善后处理。

BOOL WINAPI DllMain(

HINSTANCE hinstDLL, //动态库实例句柄

DWORD fdwReason,    //被调用的原因

LPVOID lpvReserved   //保留值

); 返回TRUE,表示动态库加载成功。

动态库的加载或卸载时会被调用。例如:使用LoadLibrary或FreeLibrary时会被调用。

附:

制作动态库:
1.新建选择倒数第2个:Win32 Dynamic-Link Library
2.函数导出(生成lib文件以调用):_declspec(dllexport)
3.Project/Settings/Links 设置 .dll 和 .ilk 的位置 复制.lib到指定存放位置

4.使用库文件:
C语言:
extern "C"_declspec(dllimport)函数;
#pragma comment(lib,"../lib/Cdll.lib")
C++语言:
_declspec(dllimport)函数;
#pragma comment(lib,"../lib/CPPdll.lib")

1.声明导出:
将函数的偏移地址 导到了 和dll配套生成lib文件中
2.模块文件
将函数的偏移地址 导到了 dll文件 和 lib文件 各一份

使用动态库
1.隐式链接
将dll文件内容导到内存的过程不需要程序员负责。
链接器从lib文件中获取函数的偏移地址。
2.显示链接
将dll文件中内容导到内存的过程需要程序员自己负责。

DLL中类的使用:
1.DLL中类的导出
在类名称前增加 _declspec(dllexport) 定义,例如:

class _declspec(dllexport) CMath {
...
};
2.通常使用预编译开关切换类的导入导出定义,例如:

#ifdef DLLCLASS_EXPORTS

#define EXT_CLASS _declspec(dllexport)//DLL

#else

#define EXT_CLASS _declspec(dllimport)//使用者

#endif

class EXT_CLASS CMath{
...
};
******* *******
// 把这些写在头文件中,用户只要加上头文件就行了

实现例子晚些再补上,可以参考这个:http://blog.sina.com.cn/s/blog_6fb3686501011ymn.html

Windows动态库的使用 part one的更多相关文章

  1. Windows动态库学习心得

    最近在工作中需要给项目组其他成员提供调用函数,决心抛弃以前“拷贝头文件/源文件”的简陋方法,采用动态库的方式对自己开发的接口进行模块化管理.因之前一直没有机会从事Windows动态库的开发,现借助这个 ...

  2. 【转】分析Linux和windows动态库

    原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...

  3. Linux和windows动态库

    转载:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 态链接库技术实现和设计程序常用的技术,在Windows和Linux系 统中 ...

  4. windows动态库与Linux动态库

    Linux动态库和windows动态库的目的是基本一致的,但由于操作系统的不同,他们在许多方面还是不尽相同.但是尽管有差异Linux动态库的windows动态库还是可以移植的,有一些规则以及经验是必须 ...

  5. linux和windows动态库加载路径区别

    # linux和windows动态库加载路径区别 ### 简介------------------------------ linux加载动态库的路径是系统目录/lib和/usr/lib.- wind ...

  6. Windows 动态库创建和使用 part 2

    一.Windows动态库的创建: 1.先选择 "DLL" 和 “控项目” 2.添加一个头文件,一个源文件  CppDll.h,CppDll.cpp,一个模块定义文件 CppDll. ...

  7. windows 动态库的封装以及调用

    1.一个程序从源文件编译生成可执行文件的步骤:预编译 -->  编译 -->  汇编 --> 链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开.处 ...

  8. windows动态库和静态库VS导入

    1. 静态库和动态库 1.1 静态库(.lib) 函数和数据被编译进一个二进制文件(通常扩展名为.LIB).在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程 ...

  9. windows 动态库导出

    以下内容来自博客:https://blog.csdn.net/fengbingchun/article/details/78825004 __declspec是Microsoft VC中专用的关键字, ...

随机推荐

  1. 【笔记】探索js 的this 对象 (第一部分)

    最近在看 你不知道的javascript 这本书,在第二部分看到了一个比较重要的知识点 那就是 this对象的全面认识,于是做一下笔记 博主本人在看这本书之前也一直以为 this 是指一切引用类型的本 ...

  2. idea 设置jetty进程jvm参数

    /** * MyEclipse6.5通过Jetty跑Web应用时提示OutOfMemoryError: PermGen space的解决办法 * @see ---------------------- ...

  3. (转)如何在maven环境中设置JVM参数

    有时候我们需要设定maven环境下的JVM参数,以便通过maven执行的命令或启动的系统能得到它们需要的参数设定.比如:当我们使用jetty:run启动jetty服务器时,在进行热部署时会经常发生:J ...

  4. tornado 多进程模式

    https://www.douban.com/note/217901726/ 官方文档的helloworld实例中的启动方法: if __name__ == "__main__": ...

  5. CF无法全屏怎么办

    方法1:把桌面的分辨率调成800X600,然后运行CF就全屏了,接着再退出游戏,把桌面重新调回原来的分辨率. 方法2:在运行中输入regedit.可以打开打开注册表编辑器,定位到HKEY_LOCAL_ ...

  6. VS2013编译boost1.55库

    1. 官网下载最新的Boost库,我的是1.55 2. 在使用vs2013编译boost-1.55.0之前,先要给boost做下修改: boost_1_55_0\boost\intrusive\det ...

  7. Unity3D实现3D立体游戏原理及过程,需偏振眼镜3D显

    http://tieba.baidu.com/p/3038509618?fr=ala0&pstaala=3

  8. android回调函数

    在我们进行android开发的时候,常常遇到一些回调函数,当中,我们最常常使用的回调就是,当我们对一个组件设置监听的时候,事实上就相对于设置的回调函数.比如: Button btn = (Button ...

  9. LR学习笔记之—参数和变量

    一.LR中参数的使用 LR中参数默认使用“{}”来表示,如果想要修改,可以再General Options/Parameterization设置参数的边界字符 经常用到的函数: lr_save_str ...

  10. ICP备案的一些tips~

    1)一个单位是一个备案主体,只能有一个主体备案号: 2)一个企业下面可以有多个网站,依次在备案号后加-1 -2,以此类推,也叫网站备案号,每个网站只能有一个网站备案号.(所谓网站,不是指域名,也不是i ...