C/C++中动态链接库的创建和调用的步骤?
这是自己平时学习做的笔记,这个动态链接库的知识主要是根据孙鑫老师视频学习的记录的,可能会对大家来说会有点乱,有什么不懂得可以问,另外特别推荐看看孙老师的视频,讲的很清晰。
win32.动态链接库(dll)的编写与引用
编写:
首先建个win32 Dynamic-Link Library 类型的空工程,取名Dlll,再添加一个Dlll.Cpp 文件,并在其中编写函数,如:
_declspec(dllexport) int add(int a,int b) //_declspec(dllexport)说明该函数为导出函数
{
return a+b;
}
_declspec(dllexport) int subtract(int a,int b)
{
return a-b;
}
编译连接后就会在Debug目录下生成一个Dlll.dll和一个lib引入库文件,这也就是我们要的dll文件了。
如果是这样生成的话,引用是在调用该函数前需做如下声明:
extern int add(int a,int b); //可以使用 _declspec(dllimport) int add(int a,int b); 代替,并且效率更高
extern int subtract(int a,int b); //可以使用 _declspec(dllimport) int subtract (int a,int b); 代替,并且效率更高
并将dll和lib文件复制到该工程下,并在VC中的工程- ---->设置----->连接选项中加入上面生成的lib文件,然后就可以使用了。
但为了让使用者更方便的调用dll中的函数,我们可以在dll工程中建一个头文件,里面包含导出函数,如下:
头文件内容:
_declspec(dllimport) int add(int a,int b);
_declspec(dllimport) int subtract (int a,int b);
然后使用时只需包含这个头文件就行了,不必再声明了。并且由于在头文件中已经使用_declspec(dllimport)声明了,所以在cpp实现文件中不必再声明了。
另外为了使用方便也可以定义一个宏:
#define DLL1_API _ declspec(dllimport)
或:
#ifdef DLL_API
#else
#define DLL1_API _ declspec(dllimport)
#endif
此外为了防止编译器自动修改函数或类的名字可以将方面:#define DLL1_API _ declspec(dllimport)
这句声明改成: #define DLL1_API extern "C" _ declspec(dllimport)
但这种有一个缺陷是:不能导出类的成员函数,并且当函数的调用约定约定发生改变时,函数名还是会改变。
所以为了解决这种问题,我们定义一个模块定义文件,即.def文件 ,然后加入到工程中。
内容为:
LIBRARY Dll1 //名字为生成的dll文件名
EXPORTS
add //可以写成 add @2 为add函数编号为2,下面获取地址时可以用到
subtract
另外在dll中也可以导出类
以上都是使用隐式调用dll文件,也可以动态加载dll文件:
HINSTANCE hInst;
hInst =LoadLibrary("Dll1.dll");
typedef int (*ADDPROC)(int a,int b);
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add");
if(!Add)
{
MessageBox("获取函数地址失败!");
return;
}
int c=Add(5,3);
由于是动态调用,所以不需要头文件,不需要lib文件,只需一个dll文件就行了,并且很省内存。
当然也可以根据编号来获取函数的地址:
把上面获取地址的那句改为:
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
另外dll文件还有一个可选的如可函数 DllMain
调用完后,如果不再调用了,可以使用FreeLibrary(hInst); 来释放动态链接库。
win32.动态链接库(dll)的编写与引用
编写:
首先建个win32 Dynamic-Link Library 类型的空工程,取名Dlll,再添加一个Dlll.Cpp 文件,并在其中编写函数,如:
_declspec(dllexport) int add(int a,int b) //_declspec(dllexport)说明该函数为导出函数
{
return a+b;
}
_declspec(dllexport) int subtract(int a,int b)
{
return a-b;
}
编译连接后就会在Debug目录下生成一个Dlll.dll和一个lib引入库文件,这也就是我们要的dll文件了。
如果是这样生成的话,引用是在调用该函数前需做如下声明:
extern int add(int a,int b); //可以使用 _declspec(dllimport) int add(int a,int b); 代替,并且效率更高
extern int subtract(int a,int b); //可以使用 _declspec(dllimport) int subtract (int a,int b); 代替,并且效率更高
并将dll和lib文件复制到该工程下,并在VC中的工程- ---->设置----->连接选项中加入上面生成的lib文件,然后就可以使用了。
但为了让使用者更方便的调用dll中的函数,我们可以在dll工程中建一个头文件,里面包含导出函数,如下:
头文件内容:
_declspec(dllimport) int add(int a,int b);
_declspec(dllimport) int subtract (int a,int b);
然后使用时只需包含这个头文件就行了,不必再声明了。并且由于在头文件中已经使用_declspec(dllimport)声明了,所以在cpp实现文件中不必再声明了。
另外为了使用方便也可以定义一个宏:
#define DLL1_API _ declspec(dllimport)
或:
#ifdef DLL_API
#else
#define DLL1_API _ declspec(dllimport)
#endif
此外为了防止编译器自动修改函数或类的名字可以将方面:#define DLL1_API _ declspec(dllimport)
这句声明改成: #define DLL1_API extern "C" _ declspec(dllimport)
但这种有一个缺陷是:不能导出类的成员函数,并且当函数的调用约定约定发生改变时,函数名还是会改变。
所以为了解决这种问题,我们定义一个模块定义文件,即.def文件 ,然后加入到工程中。
内容为:
LIBRARY Dll1 //名字为生成的dll文件名
EXPORTS
add //可以写成 add @2 为add函数编号为2,下面获取地址时可以用到
subtract
另外在dll中也可以导出类
以上都是使用隐式调用dll文件,也可以动态加载dll文件:
HINSTANCE hInst;
hInst =LoadLibrary("Dll1.dll");
typedef int (*ADDPROC)(int a,int b);
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add");
if(!Add)
{
MessageBox("获取函数地址失败!");
return;
}
int c=Add(5,3);
由于是动态调用,所以不需要头文件,不需要lib文件,只需一个dll文件就行了,并且很省内存。
当然也可以根据编号来获取函数的地址:
把上面获取地址的那句改为:
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
另外dll文件还有一个可选的如可函数 DllMain
调用完后,如果不再调用了,可以使用FreeLibrary(hInst); 来释放动态链接库。
佚名
2024-11-06 05:06:41
类似问题(10)
-
佚名2024-11-06 23:24:39
问C/c++的多线程编程怎么学习啊?还有就是谁能给我一个C/C++的库文档?谢谢了
答对于刚入门,你可以玩玩pthread库在codeblocks使用pthread库编写多线程应用,很方便啊现在c++11语言内建就支持多线程模型C/C++感兴趣的...
-
佚名2024-11-06 08:00:00
问VC++6.0如何创建与调用动态链接库
答VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL...
-
佚名2024-11-06 08:00:00
问VC++ 6.0如何创建与调用动态链接库
答参考http://
-
佚名2024-11-06 08:00:00
问VC++6.0如何将动态链接库与exe合并成为新的exe发布
答RE:那样设置只是把MFC库静态连接到EXE文件中。如果您想自己将DLL连接到EXE中的话是比较困难的,不过您可以使用静态连接库(*.lib),它的编写与DLL...
-
佚名2024-11-06 08:00:00
问C/C++中动态链接库的创建和调用的步骤?
答动态连接库的创建步骤:一、创建Non-MFC DLL动态链接库 1、打开File —> New —> Project选项,选择Win32 Dynamic-Li...
-
佚名2024-11-06 08:00:00
问c++动态链接的声明和实现函数 怎么做成动态链接库
答动态链接库的使用方法,动态链接库的动态调用(也叫显式调用)可以运用了,但是静态调用(也叫隐式调用)这种很少见。 (一)先回顾一下,动态链接库和静态链接库 静...
-
佚名2024-11-06 08:00:00
问如何用c/c++编写和调用dll动态链接库。
答假设名为a.dll导出了函数int sum(int a, int b);应这样调用:HMODULE hLib = LoadLibrary("a.dll"); /...
-
佚名2024-11-06 08:00:00
问钢琴C调和弦是哪
答C大调和弦对应的是键盘上的C,D,E,F,G,A,B(1、2、3、4、5、6、7),即钢琴一组音阶当中的白键。C小调则是对应的是C、D、降E、F、G、降A、降B...
-
佚名2024-11-06 08:00:00
问在歌曲都能用C调吗 浏阳河D调该C调咋配和铉
答如果你懂得和弦的级数和各个级数和弦关系的话。移调是很简单的。其实就是把所有和弦往下移一度,本来是D和弦的,换成C.E换成D,以此类推。
-
佚名2024-11-06 08:00:00
问c#中usingSystem.IO; 的作用
答using xxxx就是引入命名空间。 命名空间可以确保函数、变量的唯一性。比如微软写了一个类库,里面有关于数组的定义、操作, 那么你需要用这个类库的时候, 就...
风水
- 1 人为什么总是梦到蛇 不管怕不怕蛇 喜欢不喜欢蛇的人好像都有梦到蛇的经验 没有见过蛇的 各种梦到蛇。。
- 2 梦见自己以前的家沙发里有两只鸭子 因为家里很久没人我去的时候它们
- 3 我梦见了我穿上了一双超高跟大概20cm的红色高跟鞋,这是什么意思?
- 4 梦见别人把3只小鸟从鸟巢里打下来
- 5 梦见蛇有四条腿然后变成龙飞走!
- 6 风水中说你的房座山没有利,是什么意思?
- 7 五帝钱和黑曜石的貔貅哪个辟邪效果更好?
- 8 非法采砂如何定罪量刑,最高司法机关给出了权威说法
- 9 解梦!梦见和前男友吵架,他说曾找我而我却不理,曾真的爱过我
- 10 为什么最近周星驰被喷人品不好,他的人品不好不是很早很早以前就被说了么
起名
- 1 林字取布行名字,前面加什么字好
- 2 刚开一整体橱柜厂,大家帮我起个名字啊,只要在百度上搜没有的就可以了谢谢了
- 3 您好,想请问一下五行属水,为什么八字又忌水,起名是跟进八字来改的吗?大师
- 4 农历2018年11月16号上午9时18分出生的男宝,李姓,八字是什么,取什么名字?
- 5 想给女孩起个名字叫李什么格的名
- 6 我姓殷老婆姓王想帮女二取四个字的名字
- 7 庞姓排字,只记住了四个字,德茂乃家全,有人知道庞姓的家谱和排字吗?
- 8 都说我的名字不好,要不要改名? 爷爷生前给我起的名:“乔昊”我是农历84年10月初6生人.
- 9 泰安哪里教架子鼓好 一小时多少钱
- 10 找个人帮我算一下,如果开个熟食店,房租是一年2万五,雇个人一个月工资2千五。然后熟食利润在40%左
网名
- 1 三个字骚气网名
- 2 超浪网名
- 3 不相信爱情的两个字网名
- 4 快手嘟嘟姐的网名叫什么
- 5 网名后面有表情
- 6 微笑诠 释r苆是不是情侣网名
- 7 微信群聊的昵称怎么隐藏
- 8 我的世界服务器名字怎么打昵称
- 9 40岁用的微信昵称
- 10 冒险岛用昵称查账号吗
说说
- 1 生气的个性签名骂人
- 2 qq个性签名带乐字
- 3 爱花人的个性签名
- 4 微信个性签名写自己电话号码
- 5 龚锦艳个性编辑签名
- 6 热了受不了的说说
- 7 全部走开的说说
- 8 情绪别致的疯子说说
- 9 今生的过客说说
- 10 想着自己的小心事说说