今天看到了之前的笔记,看到之前写的笔记,感觉自己都不认得了~~一、静态链接库(lib)
首先创建 “在VC6中创建项目:Win32 Static Library”
在项目中创建两个文件:xxx.h 和 xxx.cpp
头文件的话就写函数声明,cpp正常来写函数实现即可!
例如:
[C] 纯文本查看 复制代码x.h代码:int Plus(int x,int y);
x.cpp代码 int Plus(int x,int y){
return x+y;
}
通过编译,则得到x.h和x.lib头文件
接下来创建一个普通的c语言程序引入h和lib文件即可
QQ截图52.png (122.49 KB, 下载次数: 2)
-12-1 18:35 上传
通过以上代码,咱们就可以使用lib里面的Plus函数了,当然,前提是要包含lib文件和头文件才可以!
二、动态链接库
VC6创建项目--Win32 Dynamic-Link Livrary
之后操作和创建静态链接库一样,头文件写函数声明,Cpp文件写函数实现,这里就不反复说了。
生成之后,导入x.lib与x.dll即可!
QQ截图205742.png (129.13 KB, 下载次数: 0)
-12-1 18:36 上传
具体看下面代码~~~~
1.隐式链接
将dll和lib文件放到工程目录下面,
将#pragma comment(lib,"dongtai.lib") 添加到调用文件中
加入extern函数声明就可以使用了
[C] 纯文本查看 复制代码extern "C" __declspec(dllimport) int Plus (int x,int y);
extern "C" __declspec(dllimport) int Sub (int x,int y);
extern "C" __declspec(dllimport) int Mul (int x,int y);
extern "C" __declspec(dllimport) int Div (int x,int y);
2.显示链接
1.定义函数指针
2.声明函数指针变量
3.动态加载dll到内存中
4.获取函数地址 GetProcAddress()
5.调用函数
[C] 纯文本查看 复制代码#include "stdafx.h"
#include
#pragma comment(lib,"dongtai.lib")
/* 隐式链接
extern "C" __declspec(dllimport) int Plus (int x,int y);
extern "C" __declspec(dllimport) int Sub (int x,int y);
extern "C" __declspec(dllimport) int Mul (int x,int y);
extern "C" __declspec(dllimport) int Div (int x,int y);
*/
//定义函数指针
typedef int (*lpPlus)(int,int);
typedef int (*lpSub)(int,int);
typedef int (*lpMul)(int,int);
typedef int (*lpDiv)(int,int);
int main(int argc, char* argv[])
{
lpPlus myPlus;//声明函数指针变量
HINSTANCE hModule = LoadLibrary("dongtai.dll");//动态加载dll到内存
myPlus = (lpPlus)GetProcAddress(hModule,"Plus");//通过GetProcAddress获取函数地址
printf("%d\n",myPlus(1,2));
return 0;
}
经过上面的简单学习,可能还有人分不清静态与动态的区别,接下来把生成的exe文件放到OD里分析
首先来看动态的,可以看到我们的程序是加载的dll文件,也就是说主要功能还是在dll里面,当函数要进行修正的时候,我们只需要修正dll文件即可。
QQ图片46.png (84.48 KB, 下载次数: 0)
-12-1 18:37 上传
静态与动态不同的区别是,静态类似于假模块化,什么是假模块呢?看似是引入了外部文件,其实在运行的时候,lib文件里的代码都贴到了exe程序里面。
接下来看反汇编,我们的lib按道理是引入进来的,但是在程序使用的时候,地址已经到了exe里面。所以当我们的lib静态库文件修改的时候,也要重新编译我们的exe文件!
QQ截图19.png (80.38 KB, 下载次数: 3)
-12-1 18:37 上传
就到这啦~