QQ网名大全

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); 来释放动态链接库。
佚名
2024-11-06 05:06:41
最佳回答
类似问题(10)