如何动态替换Windows下的一个函数

 我来答
EvenHHZ
2017-05-10 · 知道合伙人软件行家
EvenHHZ
知道合伙人软件行家
采纳数:13691 获赞数:18845
个人出版图书:《玩转Python网络爬虫》、《玩转Django2.0》

向TA提问 私信TA
展开全部
1.静态库
1)创建过程
在VS环境下创建一个 “Win32 Static Libarary” 工程StaticLib,添加头文件lib.h和源文件lib.cpp

1
2
3
4
5
6
7
8
9
10
11

//----lib.h----------
int add(int a,int b);

//-----lib.cpp-------
#include "lib.h"

int add(int a,int b)
{
return a+b;
}

Build之后会发现Debug下生成了StaticLib.lib 静态库文件。 将lib.h和StaicLib.lib给别人,别人就可以使用库中的函数add了。

2)调用过程
新建一个简单的控制台工程,只有一个StaticLibCall.cpp 。 将lib.h和StaticLib.lib放在同目录下。
+ View Code
编译链接运行成功。
此处若在add(2,3)设置断点,调试态 F11进入函数可以跳入到StaticLib.cpp中进行执行。可以知道静态库在调用过程中是会和源文件一起编译链接的。
其中 #pragma comment(lib,"StaticLib.lib") 是用来说明静态库调用,也可以在VS界面上设置:依次选择tools、options、directories、library files添加。
标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。F11同样可以进入对应的**.c文件中。

2. 动态库
动态库比静态库的创建和调用都复杂。因为动态库中的函数分为两种,1种为内部函数,只供库内部使用。 2种为导出函数,只有声明为导出函数,才可以给别人使用。
创建时声明导出方式有2种: 1.__declspec(dllexport) 方式
2.DEF文件方式
使用时链接动态库方式也有2种: 1.静态链接方式 :同静态库的调用方式 #pragma comment(lib,"***.lib")
2.动态链接方式:使用Win32系列函数:LoadLibrary(...) GetProcAddress(...) FreddLibrary(...)
所以,组合起来有4种方式完成动态库的 ”创建和使用“ 的过程。 由于不同交叉的方式中注意的问题不同,所以分别说明。
1)__declspec(dllexport) 方式导出方式,静态方式链接
A.创建: 在VS环境下创建一个 “Win32 DLL ” 工程AddDll,添加头文件dll.h和源文件dll.cpp

Build之后发现,Debug中生成了AddDll.lib和AddDll.dll文件。 将.h .lib .dll提供给别人,别人就可以使用动态库中的add函数了。
B. 静态方式调用:
新建一个控制台工程,只有一个AddDllCall.cpp 文件。 并且将 dll.h放在同目录下,AddDll.lib AddDll.dll 放在该工程的Debug下。
注意:因为动态库是在运行时才调用,所以必须放在运行时的目录下,否则会找不到dll库。

运行成功。
注:有些人说,导出方式为__declspec(dllexport)时,调用时的函数声明需要为__declspec(dllimport) add(int a,int b);这里测验发现并没有这个问题
调用时#include ”dll.h" 只有一句话 int add(int a,int b);正常的函数声明。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式