[拾零]C/C++_代码复用的实现_静态链接库_动态链接库_使用.def导出
1 静态链接库
1.1 创建静态链接库:
1、在VC6中创建项目:Win32 Static Library
2、在项目中创建两个文件:xxx.h 和 xxx.cpp
3、编译
1.2 使用静态链接库
方式一:
1、将xxx.h 和 xxx.lib复制到要使用的项目中
2、在需要使用的文件中包含:#include "xxx.h"
3、在需要使用的文件中包含:#pragma comment(lib, "xxx.lib")
方式二:
1、将xxx.h 和 xxx.lib复制到要使用的项目中				
2、在需要使用的文件中包含:#include "xxx.h"	

静态链接库的缺点
使用静态链接生成的可执行文件体积较大,造成浪费
我们常用的printf、memcpy、strcpy等就来自这种静态库
2 动态链接库
2.1 创建DLL
1、源文件中:
int __stdcall Plus(int x,int y)
{
	return x+y;
}
int __stdcall Sub(int x,int y)
{
	return x-y;
}
int __stdcall Mul(int x,int y)
{
	return x*y;
}
int __stdcall Div(int x,int y)
{
	return x/y;
}
2、头文件中
extern "C" _declspec(dllexport) __stdcall int Plus (int x,int y);
extern "C" _declspec(dllexport) __stdcall int Sub (int x,int y);
extern "C" _declspec(dllexport) __stdcall int Mul (int x,int y);
extern "C" _declspec(dllexport) __stdcall int Div (int x,int y);
说明:
1、extern 表示这是个全局函数,可以供各个其他的函数调用;
2、"C" 按照C语言的方式进行编译、链接	
__declspec(dllexport)告诉编译器此函数为导出函数;
2.2 使用DLL
方式一:隐式连接
步骤1:将 *.dll  *.lib 放到工程目录下面
步骤2:将 #pragma comment(lib,"DLL名.lib") 添加到调用文件中
步骤3:加入函数的声明
extern "C" __declspec(dllimport) __stdcall int Plus (int x,int y);
extern "C" __declspec(dllimport) __stdcall int Sub (int x,int y);
extern "C" __declspec(dllimport) __stdcall int Mul (int x,int y);
extern "C" __declspec(dllimport) __stdcall int Div (int x,int y);		
说明:
__declspec(dllimport)告诉编译器此函数为导入函数;
方式二:显示链接
步骤1:	//定义函数指针
	typedef int (__stdcall *lpPlus)(int,int);
	typedef int (__stdcall *lpSub)(int,int);
	typedef int (__stdcall *lpMul)(int,int);
	typedef int (__stdcall *lpDiv)(int,int);	
步骤2:  //声明函数指针变量
	lpPlus myPlus;
	lpSub mySub;
	lpMul myMul;
	lpDiv myDiv;	
步骤3:  //动态加载dll到内存中
	HINSTANCE   hModule = LoadLibrary("DllDemo.dll"); 	
步骤4:  //获取函数地址
	myPlus = (lpPlus)GetProcAddress(hModule,   "_Plus@8");
	mySub = (lpSub)GetProcAddress(hModule,   "_Sub@8");
	myMul = (lpMul)GetProcAddress(hModule,   "_Mul@8");
	myDiv = (lpDiv)GetProcAddress(hModule,   "_Div@8");	
步骤5:	//调用函数
	int a = myPlus(10,2);
	int b = mySub(10,2);
	int c = myMul(10,2);
	int d = myDiv(10,2);	
特别说明:
Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
HMODULE 是代表应用程序载入的模块	
HINSTANCE 在win32下与HMODULE是相同的东西 Win16 遗留	
HWND 是窗口句柄
其实就是一个无符号整型,Windows之所以这样设计有2个目的:		
1、可读性更好		
2、避免在无意中进行运算
3 使用.def导出
1、*.h文件	
int Plus (int x,int y);
int Sub (int x,int y);
int Mul (int x,int y);
int Div (int x,int y);	
2、*.cpp文件	
int Plus(int x,int y)
{
	return x+y;
}
int Sub(int x,int y)
{
	return x-y;
}
int Mul(int x,int y)
{
	return x*y;
}
int Div(int x,int y)
{
	return x/y;
}	
3、*.def文件	
EXPORTS	
Plus   	@12
Sub	@15 NONAME
Mul    	@13
Div    	@16
4、使用序号导出的好处:	
名字是一段程序就精华的注释,通过名字可以直接猜测到函数的功能	
通过使用序号,可以达到隐藏的目的.
[拾零]C/C++_代码复用的实现_静态链接库_动态链接库_使用.def导出的更多相关文章
- Python基础篇(三)_函数及代码复用
		Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ... 
- if __name__== "__main__" 的意思(作用)python代码复用
		if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ... 
- Atitit 代码复用的理解attilax总结
		Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ... 
- javascript 模式(1)——代码复用
		程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ... 
- HTML 代码复用实践 (静态页面公共部分提取复用)
		原文:HTML 代码复用实践 上面的链接里面安装配置步骤已经非常详细,这里主要记录我操作过程中遇到的几个问题 gulp-file-include 的使用 按上面的步骤安装之后,node_mod ... 
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
		HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ... 
- 《JavaScript模式》第6章 代码复用模式
		@by Ruth92(转载请注明出处) 第6章:代码复用模式 GoF 在其著作中提出的有关创建对象的建议原则: -- 优先使用对象组合,而不是类继承. 传统模式:使用类继承: 现代模式:"类 ... 
- javascript代码复用(四)-混入、借用方法和绑定
		这篇继续说js的现代复用模式:混入.借用方法和绑定. 混入 可以针对前面提到的通过属性复制实现代码复用的想法进行一个扩展,就是混入(mix-in).混入并不是复制一个完整的对象,而是从多个对象中复制出 ... 
- javascript代码复用模式(二)
		前面说到,javascript的代码复用模式,可分为类式继承和非类式继承(现代继承).这篇就继续类式继承. 类式继承模式-借用构造函数 使用借用构造函数的方法,可以从子构造函数得到父构造函数传任意数量 ... 
随机推荐
- JS---分解质因数
			<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ... 
- Java关键字以及一些基础解释
			Java Se:Java Me 和Java Ee的基础,允许开发和部署在桌面,服务器,嵌入式环境和实时环境中使用的java程序,支持java web服务开发类 java ee:是目前java技术应用最 ... 
- javascript getAttribute
			var nodes = document.getElementsByTagName("script"); var node = nodes[nodes.length - 1]; v ... 
- c# link 学习网站
			http://www.cnblogs.com/shanyou/p/4353433.html 
- MFC编辑框数据实时更新问题
			在VC里,很多情况下需要更新控件,也就是调用UpdateData(FALSE);但是如果是在循环中调用该函数,会导致没有时间来刷新界面,消息得不到相应,从外部看来,似乎整个循环只执行了一次Update ... 
- Maven查找添加方式
			可以通过以下链接 : https://mvnrepository.com/ 
- Uncommon Words from Two Sentences
			https://leetcode.com/problems/uncommon-words-from-two-sentences We are given two sentences A and B. ... 
- PyCharm中导入第三方包
			在Windows中的PyCharm中导入模块的方法 1.在file-->setting-->project interpreter中 2,点击右上角加号,搜索要添加的第三方库的名称,得到后 ... 
- ue4 简单数据储存
- ue4 htcvivi简单配置
			1 主角视口:相机与控制器挂载 Chaperone设置,主角bp上加上SteamVRChaperone用于提示用户可用区域边界 MotionController1里面选项设置为Right右手,然后下边 ... 
