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、使用序号导出的好处: 名字是一段程序就精华的注释,通过名字可以直接猜测到函数的功能 通过使用序号,可以达到隐藏的目的.

最新文章

  1. 来自于微信小程序的一封简讯
  2. web加密的基本概念
  3. C算法编程题(六)串的处理
  4. tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()
  5. 如何配置QuickFIX/N
  6. metasploit连接数据库
  7. linux 查看所有用户
  8. linux自定义脚本添加到rc.local脚本无法正常运行的问题
  9. Debug模式应用程序输出Debug调试信息(现成的宏定义,用于格式化打印信息)
  10. 【制作镜像】安装VMwareTool
  11. PE框架学习之道:PE框架——style的配置
  12. linux小白成长之路1————通过Parallels安装CentOS虚拟机
  13. 使用“万能数据库查询分析器”的Windows 7、Windows 8、Windows 10的用户须知
  14. JS 循环定时的一些思考
  15. 高可用Eureka注册中心配置说明(双机部署)
  16. ConcurrentHashMap 与 Hashtable
  17. 数字对讲系统开发札记(前端linux c 后端 c#)
  18. 牛客练习赛 小A与任务 解题报告
  19. linux下安装zabbix服务器
  20. HDU2444 The Accomodation of Students

热门文章

  1. Ubuntu下mysql修改连接超时wait_timeout
  2. java性能调优的11个建议
  3. 三层架构与MVC比较:
  4. Advanced R之函数
  5. simple demo of Handlebars.js & jquery.js
  6. [hdu4812]D Tree(点分治)
  7. 第二课2、ROS
  8. 函数PARSENAME使用和截取字符串
  9. OVS编译
  10. OVS数据库操作