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-06-07 17:54:34
类似问题(10)
-
佚名2024-06-07 14:05:51
问C/c++的多线程编程怎么学习啊?还有就是谁能给我一个C/C++的库文档?谢谢了
答对于刚入门,你可以玩玩pthread库在codeblocks使用pthread库编写多线程应用,很方便啊现在c++11语言内建就支持多线程模型C/C++感兴趣的...
-
佚名2024-06-07 08:00:00
问VC++6.0如何创建与调用动态链接库
答VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL...
-
佚名2024-06-07 08:00:00
问VC++ 6.0如何创建与调用动态链接库
答参考http://
-
佚名2024-06-07 08:00:00
问VC++6.0如何将动态链接库与exe合并成为新的exe发布
答RE:那样设置只是把MFC库静态连接到EXE文件中。如果您想自己将DLL连接到EXE中的话是比较困难的,不过您可以使用静态连接库(*.lib),它的编写与DLL...
-
佚名2024-06-07 08:00:00
问C/C++中动态链接库的创建和调用的步骤?
答动态连接库的创建步骤:一、创建Non-MFC DLL动态链接库 1、打开File —> New —> Project选项,选择Win32 Dynamic-Li...
-
佚名2024-06-07 08:00:00
问c++动态链接的声明和实现函数 怎么做成动态链接库
答动态链接库的使用方法,动态链接库的动态调用(也叫显式调用)可以运用了,但是静态调用(也叫隐式调用)这种很少见。 (一)先回顾一下,动态链接库和静态链接库 静...
-
佚名2024-06-07 08:00:00
问如何用c/c++编写和调用dll动态链接库。
答假设名为a.dll导出了函数int sum(int a, int b);应这样调用:HMODULE hLib = LoadLibrary("a.dll"); /...
-
佚名2024-06-07 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-06-07 08:00:00
问在歌曲都能用C调吗 浏阳河D调该C调咋配和铉
答如果你懂得和弦的级数和各个级数和弦关系的话。移调是很简单的。其实就是把所有和弦往下移一度,本来是D和弦的,换成C.E换成D,以此类推。
-
佚名2024-06-07 08:00:00
问c#中usingSystem.IO; 的作用
答using xxxx就是引入命名空间。 命名空间可以确保函数、变量的唯一性。比如微软写了一个类库,里面有关于数组的定义、操作, 那么你需要用这个类库的时候, 就...
风水
起名
网名
- 1 伤感微信网名俩字
- 2 带古风的情侣网名大全
- 3 4字网名孤巷的猫
- 4 女孩名字古风网名
- 5 陌陌成熟伤感网名男生
- 6 描写心累的微信昵称
- 7 qq昵称冬什么意思
- 8 搜狐新闻账号昵称修改
- 9 微信昵称怎么不能改成符号翅膀了呢
- 10 tfboys名字昵称
说说
- 1 qq个性签名干净女生
- 2 能抢的走的说说
- 3 割草的说说
- 4 被梦惊醒的长篇说说
- 5 一家人出游后幸福说说
- 6 好伙食的说说
- 7 男生无助失落的句子说说心情说说
- 8 关于早安的温暖句子说说心情短语
- 9 用英文说说学校的生活
- 10 小丑开心说说