如何正确创建DLL和使用DLL
答案:2 悬赏:0 手机版
解决时间 2021-03-15 06:52
- 提问者网友:临风不自傲
- 2021-03-14 16:14
如何正确创建DLL和使用DLL
最佳答案
- 五星知识达人网友:底特律间谍
- 2021-03-14 17:20
一、DLL中导出类、函数、对象
1. 创建一个空的Win32 Dynamic-Link Library项目Test
2. 在项目中添加一个Test.h头文件,该文件的内容如下://导出类class __declspec(dllexport) CTest
...{
...};//导出函数__declspec(dllexport) void FuncTest();//导出对象extern __declspec(dllexport) CTest ObjTest;这段代码中通过__declspec(dllexport)导出了类CTest、函数FuncTest和对象ObjTest。在.cpp文件中实现上面的声明与类的定义后,经编译就可以生成一个.dll和.lib文件了。
二、静态加载DLL
1. 新建一个Win32 项目。
2. 将上面编译生成的.lib文件复制到,该项目下。
3. 在项目中添加一个Test.h(通过该文件实现对DLL的静态加载),该.h文件的内容主要是从DLL的.h文件中复制过来。具体内容如下:
#pragma comment(lib, "test.lib")//导入类class __declspec(dllimport) CTest
......{
...};//导入函数__declspec(dllimport) void FuncTest();//导入对象extern __declspec(dllimport) CTest ObjTest;这个.h文件与dll的.h的不同就是,在开头加了#pragma comment(lib, "test.lib"),以及类、函数、对象前面的__declspec(dllexport)变成了__declspec(dllimport) 。通过这些修改就可以告诉编译器,这个.h文件中定义的类、声明的函数和对象 都是从test.dll中导入的。在项目中完成对这些类、函数、对象的调用代码后,就可以将其编译成可执行文件。将生成的可执行为文件、以及上面生成的.dll文件复制到同一个文件夹中就可以正常运行这个可执行文件。
三、动态加载DLL
LIBRARY TestImpEXPORTSObjTestFuncTest在完成.def文件后,重新编译dll。重新编译dll后就可以对该Dll进行动态调用了,调用过程的代码如下:
typedef void (*HFUNC)()
HINSTANCE hDLL = LoadLibrary("Test.dll"); //加载DLLif(hDLL)
...{
HFUNC hFun = (HFUNC)GetProcAddress(hDLL, "FuncTest"); //获得Dll中FuncTest函数的指针。
if (hFun)hFun(); //执行函数FuncTestelse
... //没有找到函数FuncTest}else
...{
//加载失败} 上面的代码实现的对DLL中函数的动态调用,在代码中通过LoadLibrary将DLL加载到内存中,然后GetProcAddress获得指定函数所在的内存地址(即该函数的函数指针),获得指向这个函数的指针后就可以对它进行调用了。
对于DLL中对象的动态调用过程基本上是一样的,先将DLL加载到内存,然后通过GetProcAddress获得对象所在的地址。
从上面可以看出,DLL的动态调用过程就是将DLL加载到内存,然后通过GetProcAddress获得DLL中指定对象或函数在该内存中的地址,通过该地址就可以对函数或对象进行调用。由于在C++中没有类的对象,也没有类指针一说,所以是无法动态使用DLL中的类的。
1. 创建一个空的Win32 Dynamic-Link Library项目Test
2. 在项目中添加一个Test.h头文件,该文件的内容如下://导出类class __declspec(dllexport) CTest
...{
...};//导出函数__declspec(dllexport) void FuncTest();//导出对象extern __declspec(dllexport) CTest ObjTest;这段代码中通过__declspec(dllexport)导出了类CTest、函数FuncTest和对象ObjTest。在.cpp文件中实现上面的声明与类的定义后,经编译就可以生成一个.dll和.lib文件了。
二、静态加载DLL
1. 新建一个Win32 项目。
2. 将上面编译生成的.lib文件复制到,该项目下。
3. 在项目中添加一个Test.h(通过该文件实现对DLL的静态加载),该.h文件的内容主要是从DLL的.h文件中复制过来。具体内容如下:
#pragma comment(lib, "test.lib")//导入类class __declspec(dllimport) CTest
......{
...};//导入函数__declspec(dllimport) void FuncTest();//导入对象extern __declspec(dllimport) CTest ObjTest;这个.h文件与dll的.h的不同就是,在开头加了#pragma comment(lib, "test.lib"),以及类、函数、对象前面的__declspec(dllexport)变成了__declspec(dllimport) 。通过这些修改就可以告诉编译器,这个.h文件中定义的类、声明的函数和对象 都是从test.dll中导入的。在项目中完成对这些类、函数、对象的调用代码后,就可以将其编译成可执行文件。将生成的可执行为文件、以及上面生成的.dll文件复制到同一个文件夹中就可以正常运行这个可执行文件。
三、动态加载DLL
LIBRARY TestImpEXPORTSObjTestFuncTest在完成.def文件后,重新编译dll。重新编译dll后就可以对该Dll进行动态调用了,调用过程的代码如下:
typedef void (*HFUNC)()
HINSTANCE hDLL = LoadLibrary("Test.dll"); //加载DLLif(hDLL)
...{
HFUNC hFun = (HFUNC)GetProcAddress(hDLL, "FuncTest"); //获得Dll中FuncTest函数的指针。
if (hFun)hFun(); //执行函数FuncTestelse
... //没有找到函数FuncTest}else
...{
//加载失败} 上面的代码实现的对DLL中函数的动态调用,在代码中通过LoadLibrary将DLL加载到内存中,然后GetProcAddress获得指定函数所在的内存地址(即该函数的函数指针),获得指向这个函数的指针后就可以对它进行调用了。
对于DLL中对象的动态调用过程基本上是一样的,先将DLL加载到内存,然后通过GetProcAddress获得对象所在的地址。
从上面可以看出,DLL的动态调用过程就是将DLL加载到内存,然后通过GetProcAddress获得DLL中指定对象或函数在该内存中的地址,通过该地址就可以对函数或对象进行调用。由于在C++中没有类的对象,也没有类指针一说,所以是无法动态使用DLL中的类的。
全部回答
- 1楼网友:千杯敬自由
- 2021-03-14 18:12
如何正确创建dll和使用dll创建的话,你可以在新建项目中选择创建dll工程,具体的选择位置跟编译器类型和版本有关,就是跟在选择win32控制台项目一样的地方。在创建的文件中,你编写的代码需要有导出的东西,编译执行
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯