Windows动态库的使用 part one
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函数,才会被加载。
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{
...
};
1 导入DLL的LIb
2 类的定义
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的更多相关文章
- Windows动态库学习心得
最近在工作中需要给项目组其他成员提供调用函数,决心抛弃以前“拷贝头文件/源文件”的简陋方法,采用动态库的方式对自己开发的接口进行模块化管理.因之前一直没有机会从事Windows动态库的开发,现借助这个 ...
- 【转】分析Linux和windows动态库
原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...
- Linux和windows动态库
转载:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 态链接库技术实现和设计程序常用的技术,在Windows和Linux系 统中 ...
- windows动态库与Linux动态库
Linux动态库和windows动态库的目的是基本一致的,但由于操作系统的不同,他们在许多方面还是不尽相同.但是尽管有差异Linux动态库的windows动态库还是可以移植的,有一些规则以及经验是必须 ...
- linux和windows动态库加载路径区别
# linux和windows动态库加载路径区别 ### 简介------------------------------ linux加载动态库的路径是系统目录/lib和/usr/lib.- wind ...
- Windows 动态库创建和使用 part 2
一.Windows动态库的创建: 1.先选择 "DLL" 和 “控项目” 2.添加一个头文件,一个源文件 CppDll.h,CppDll.cpp,一个模块定义文件 CppDll. ...
- windows 动态库的封装以及调用
1.一个程序从源文件编译生成可执行文件的步骤:预编译 --> 编译 --> 汇编 --> 链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开.处 ...
- windows动态库和静态库VS导入
1. 静态库和动态库 1.1 静态库(.lib) 函数和数据被编译进一个二进制文件(通常扩展名为.LIB).在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程 ...
- windows 动态库导出
以下内容来自博客:https://blog.csdn.net/fengbingchun/article/details/78825004 __declspec是Microsoft VC中专用的关键字, ...
随机推荐
- Guava缓存使用
public class GuavaCache { /** * LoadingCache当缓冲中不存在时,可自动加载 * */ private static LoadingCache<Integ ...
- vs2012升级到vs2013后,sql server 无法通过IP登录解决方案
因项目需要,vs升级到2013,可是数据库通过IP却无法连接,一直报内存异常,困扰许久,原来是.net框架出了问题,可以通过用管理员身份运行:netsh winsock reset解决!
- DOM BOM document window 区别
DOM 是为了操作文档出现的 API,document 是其的一个对象: BOM 是为了操作浏览器出现的 API,window 是其的一个对象. 使用下图讲解: 归DOM管的: E区:即doc ...
- Odoo8.0安装wkhtmltopdf报表运行环境
#下载 #注意根据操作系统选择相应版本 (旧地址)wget http://sourceforge.net/projects/wkhtmltopdf/files/0.12.1/wkhtmltox ...
- C++14系列(1):Linux下C++14开发环境配置
g++安装 參考地址: http://sysads.co.uk/2014/07/install-gcc-gnu-4-9-1-on-ubuntu-14-04/ 当前Ubuntu的LTS版本号为14.04 ...
- CodeIgniter 2.X 于 PHP5.6 兼容错误
本篇文章由:http://xinpure.com/codeigniter-2-x-to-php5-6-compatible-error/ CI 3.0 已兼容此问题 在代码迁移的过程中,遇到了一个 P ...
- jquery easyUi columns日期格式化
jquery easyUi columns日期格式化 方法一 Date.prototype.format = function (format) { var o = { "M+" ...
- LinkedList的一种错误使用方法
近期在做图像处理的时候.发现某一段代码很的慢.慢得让人无法接受.基本的代码是顺序訪问一个LinkedList的元素,效果是随着index的变大,速度越来越慢,list的元素个数在百万以上.找到原因,分 ...
- Android PagerSlidingTitleIconTabStrip 能够在title旁边加小图标的PagerSlidingTabStrip
public class MainFragmentPagerAdapter extends FragmentPagerAdapter implements TitleIconTabProvider{ ...
- asp.net,cookie,写cookie,取cookie(转载)
Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...