MFC动态链接库的创建和调用(类和函数的dll导出和调用)
- 格式:pdf
- 大小:739.97 KB
- 文档页数:7
mfc 扩展dll用法MFC(Microsoft Foundation Classes)是Microsoft提供的一套用于构建Windows图形用户界面(GUI)应用程序的C++类库。
MFC扩展DLL (Dynamic Link Library)通常用于在MFC应用程序中引入额外的功能或模块,以便于代码的组织和模块化。
以下是使用MFC扩展DLL的一般步骤:1.创建MFC DLL项目:在Visual Studio中,您可以选择创建一个MFC DLL项目。
这会生成一个具有MFC支持的DLL项目的基本框架。
2.实现DLL功能:在DLL项目中,您可以添加或实现所需的功能和类。
这些功能可以包括窗口、对话框、控件、业务逻辑等。
3.导出功能:对于需要在DLL外部使用的函数或类,需要在其声明前添加AFX_EXT_CLASS宏,以便正确导出。
例如:class AFX_EXT_CLASS MyExportedClass {//...};extern "C" AFX_EXT_CLASS void AFXAPI MyExportedFunction();4.生成DLL:构建DLL项目以生成DLL文件。
5.在主应用程序中使用DLL:在MFC主应用程序项目中,您需要做以下操作:•将DLL的头文件包含到主应用程序中。
•将DLL的.lib文件链接到主应用程序项目。
•将DLL的.dll文件与主应用程序的可执行文件放在相同的目录或系统路径下。
6.调用DLL中的功能:在主应用程序中,您可以通过类似以下方式调用DLL中的函数或使用DLL中的类:#include "MyDLL.h"//...MyExportedFunction(); // 调用DLL中的函数MyExportedClass myObj; // 创建DLL中的类的实例7.清理:在主应用程序中确保正确处理DLL资源的加载和释放,以避免内存泄漏等问题。
创建动态链接库时设置导出函数的⽅法有两种⽅法1.使⽤模块定义⽂件, 2.在要导出的函数前加上 __declspec(dllexport)我们⽤VS2008新建个DLL⼯程,⼯程名为“TestDLL”把默认的源⽂件后缀 .CPP改为.C(C⽂件)int _stdcall MyFunction(int iVariant){return0;}1. 使⽤传统的模块定义⽂件 (.def)新建⼀个后缀为.def的⽂本⽂件(这⾥建⼀个TestDll.Def),⽂件内容为:LIBRARY TestDllEXPORTSMyFunction在 Link 时指定输⼊依赖⽂件:/DEF:"TestDll.Def"2. Visual C++ 提供的⽅便⽅法在01⾏的int 前加⼊ __declspec(dllexport) 关键字通过以上两种⽅法,我们就可以导出MyFunction函数。
我们⽤查看导出的函数:第⼀种⽅法导出的函数为:MyFunction第⼆种⽅法导出的函数为:_MyFunction@4__stdcall会使导出函数名字前⾯加⼀个下划线,后⾯加⼀个@再加上参数的字节数,⽐如_MyFunction@4的参数(int iVariant)就是4个字节__fastcall与 __stdcall类似,不过前⾯没有下划线,⽽是⼀个@,⽐如@MyFunction@4__cdecl则是始函数名。
⼩结:如果要导出C⽂件中的函数,并且不让编译器改动函数名,⽤def⽂件导出函数。
下⾯我们来看⼀下C++⽂件我们⽤VS2008新建个DLL⼯程,⼯程名为“TestDLL”默认的源⽂件后缀为 .CPP (即C++⽂件)。
输⼊测试代码如下:01 int _stdcall MyFunction(int iVariant)02 {03 return 0;04 }为了导出上⾯这个函数,我们有以下⼏个⽅法:3. 使⽤传统的模块定义⽂件 (.def)新建⼀个后缀为.def的⽂本⽂件(这⾥建⼀个TestDll.Def),⽂件内容为:LIBRARY TestDllEXPORTSMyFunction在 Link 时指定输⼊依赖⽂件:/DEF:"TestDll.Def"4. Visual C++ 提供的⽅便⽅法在01⾏的int 前加⼊ __declspec(dllexport) 关键字通过以上两种⽅法,我们就可以导出MyFunction函数。
MFC调用DLL基本步骤
2013-5-9
第一步:创建动态链接库
1、创建动态链接库工程
2、选择一个可以到处某些符号的DLL工程
3、添加Add加法函数。
打开Math.cpp文件,在文件最后输入函数代码
打开Math.h文件,在文件中加入函数声明语句,以方便外部调用Add函数
4、按F7或者Build按钮,此时将产生Math.dll和Math.lib文件,在Debug文件夹内,Math.h文件在Debug文件外
第二步在工程中使用DLL
1、在2DCAD中添加调用DLL的对话框并进行设置ID号
2、添加对话框类CTestDllDlg,并添加成员变量
3、将动态链接库文件复制到2DCAD目录下,有三个Math.dll、Math.lib、Math.h
4、给等号按钮添加消息处理
打开CTestDllDlg的OnButtonEqual函数,调用函数实现求和。
修改函数代码如下:
在TestDllDlg.cpp中包含动态链接库Math.dll的头文件Math.h:#include “Math.h”
5、将Math.lib加入到工程链接库
6、在2DCAD程序中弹出CTestDllDlg对话框
为2DCAD添加一个顶层菜单DLL和一个菜单项使用[Math.dll],修改菜单项ID为ID_DLL_MATH,并添加消息处理函数
修改函数如下:
在MainFrm.cpp中包含对话框类头文件:#include “TestDllDlg.h”
6、编译并运行2DCAD程序即可。
DLL的创建与调用1、DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。
这些可以直接拿来使用。
静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式。
静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
2、创建一个DLL2.1 非MFC的DLL2.1.1声明导出函数:extern “C” __declspec(dllexport) int add(int a, int b);其中extern “C”为声明为C编译。
由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。
这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。
__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数从dll中声明输出函数有两种方式:(1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
dll的创建和使用使用C++语言创建dll并使用该dll的演示、说明Dll的创建和使用第一部分创建C风格的dll (4)步骤1:创建dll工程 (4)步骤2:文件改名 (5)步骤3:拷贝文件内容 (6)步骤4:从工程中删掉文件main.cpp,main.h (7)步骤5:继续修改文件mydll.h和mydll.cpp (7)步骤6:编译并生成dll文件 (8)第二部分以间接调用的方式使用.dll (10)步骤1:新建一个控制台工程(UseDll.cbp). (10)步骤2:修改main.cpp。
(11)步骤3:编译,生成UseDll.exe (12)步骤4:拷贝mydll.dll到UseDll.exe所在目录 (13)步骤5:执行UseDll.exe,输出: (13)间接调用Dll的好处 (14)第三部分以直接调用的方式使用.dll (15)步骤1:改写main.cpp (15)步骤2:添加mydll.dll的静态导出库到UseDll工程中 (16)步骤3:编译并执行,输出 (17)直接调用的好处 (18)Dll的优势 (18)调用约定的说明 (18)第四部分创建C++风格的dll(本地方法) (19)步骤1:在mydll.h中新增导出的类 (19)步骤2:在mydll.cpp中实现Cat类 (19)步骤3:编译MyDll,生成mydll.dll,mydll.a (21)第五部分使用本地风格的C++ DLL (22)步骤1:修改UseDll中的main.cpp (22)步骤2:将mydll.a添加到UseDll工程的BuildOptions中 (23)步骤3:编译UseDll工程,生成UseDll.exe (23)步骤4:将MyDll.dll拷贝到UseDll.exe目录下 (23)步骤5:执行UseDll.exe,输出 (23)本地风格的不足 (24)第六部分创建推荐风格的C++ DLL (26)步骤1:修改mydll.h,创建Cat的接口类ICat (26)步骤2:新建类Cat (27)步骤3:实现createCat函数 (29)步骤4:编译,生成mydll.dll (31)第七部分使用推荐风格的C++ DLL (32)步骤1:修改UseDll中的main.cpp (32)步骤2:将第六部分生成的libmydll.a添加到UseDll的BuildOptions中 (33)步骤3:编译UseDll工程,生成useDll.exe (34)步骤4:将第六部分生成的mydll.dll拷贝到UseDll.exe所在文件目录 (34)步骤5:执行,输出 (35)推荐风格的好处: (35)第一部分创建C风格的dll下面以CodeBlocks为例演示说明创建和使用dll,其它开发环境类似步骤1:创建dll工程创建dll工程MyDll.cpp步骤2:文件改名新建两个文件mydll.h和mydll.cpp步骤3:拷贝文件内容将main.h中的核心内容拷贝到mydll.h中再将main.cpp中的部分内容拷贝到mydll.cpp中,并更改include文件名。
动态链接库DLL导出函数并导⼊使⽤动态链接库DLL导出函数并导⼊使⽤本⽂完全参考⾃《》。
⾸先制作DLL⽂件,在vs2010中新建Win32控制台项⽬,选择DLL选项,简历头⽂件,源⽂件如下:头⽂件:// MyDll.hextern"C" _declspec(dllexport) int Max(int a, int b);extern"C" _declspec(dllexport) int Min(int a, int b);extern"C" _declspec(dllexport) bool cim2scada(char* cimId, char** scadaId);源⽂件:// MyDll.cpp : Defines the exported functions for the DLL application.//#include "MyDll.h"#include <iostream>int Max(int a, int b){if (a >= b){return a;}else{return b;}}int Min(int a, int b){if (a >= b){return b;}else{return a;}}bool cim2scada(char* cimId, char** scadaId){char* result;if (cimId == NULL){printf("空指针!");return false;}else if (strlen(cimId) == 0){printf("cimId⽆值!");return false;}if (strcmp(cimId, "aaaaaa") == 0){result = "1000";}else if (strcmp(cimId, "bbbbbb")){result = "2000";}*scadaId = result;printf("fun scadaId: %s \n", *scadaId);return true;}然后,创建测试样例,重新简历Win32控制台程序,选择控制台选项,建⽴测试代码:#include "windows.h"#include <iostream>int main(){typedef int (*pMax)(int a, int b);typedef int (*pMin)(int a, int b);typedef bool (*pcim2scada)(char* cimid, char** scada);HINSTANCE HDLL;HDLL = LoadLibrary(L"MyDll.dll"); // 加载动态链接库MyDll.dll⽂件;pMax Max = (pMax)GetProcAddress(HDLL, "Max");pMin Min = (pMin)GetProcAddress(HDLL, "Min");pcim2scada cim2scada = (pcim2scada)GetProcAddress(HDLL, "cim2scada");int a = Max(5, 12);char* cimId = "aaaaaa";char* scadaId = "";bool b = cim2scada(cimId, &scadaId);printf("Max结果为%d\n", a);printf("cimId:%s, scadaId:%s\n", cimId, scadaId);FreeLibrary(HDLL); // 卸载MyDll.dll⽂件}编译⽣成Debug⽂件夹,讲之前⽣成的Dll⽂件拷贝到该Debug⽂件夹中,然后运⾏该测试样例。
操作系统实验一_动态链接库的建立与调用动态链接库(Dynamic Link Library,简称DLL),是一种可执行文件格式,可以包含一些可被其他程序共享和调用的代码、数据和资源。
与静态链接库相比,动态链接库在系统运行时被加载,可以实现动态更新和共享代码的功能。
在操作系统实验一中,我们将学习如何建立和调用动态链接库。
动态链接库的建立通常包括以下步骤:1.编写库文件的源代码:首先,需要编写动态链接库所包含的代码。
这些代码可以是函数、类、变量等程序模块的实现。
在编写代码时,需要注意代码的可重用性和可扩展性,以便其他程序可以调用和使用这些代码。
2.编译源代码生成库文件:将源代码编译成目标文件,并链接生成动态链接库文件。
在编译和链接过程中,需要根据编译器和操作系统的要求设置编译选项和链接选项,例如指定动态链接库的输出格式和名称等。
3.导出函数和符号:在编写代码时,需要使用适当的方式声明和定义函数、类、变量等实体,以便其他程序可以调用和使用它们。
在编译和链接过程中,需要使用一些特殊的关键字或指令来指定导出的函数和符号。
4.生成库文件:使用编译器和链接器将目标文件生成动态链接库文件,并进行必要的优化和处理。
生成的库文件通常包含一些元数据信息,例如导出函数和符号的位置和名称等。
动态链接库的调用通常包括以下步骤:1.导入库文件的头文件:在调用动态链接库的程序中,需要包含动态链接库的头文件。
该头文件包含了库文件中导出函数和符号的声明和定义。
2.加载动态链接库:在程序启动时,需要使用操作系统提供的加载动态链接库的函数来加载动态链接库文件。
加载动态链接库时,需要提供动态链接库的文件路径或其他标识符。
3.获取导出函数的地址:在加载动态链接库后,可以使用操作系统提供的函数来查询和获取动态链接库中导出函数和符号的地址。
获取导出函数的地址后,可以通过函数指针来调用动态链接库中的函数。
4.调用动态链接库函数:通过获取到的函数指针,可以直接调用动态链接库中的函数。
1.新建MFC DLL工程,取名为:DLL0410
动态链接库的创建和调用(类,函数的DLL导出和调用)
2.在工程中编辑好DLL0410.h,DLL0410.cpp,DLL0410.def三个文件后编译生成对应的dll和lib文件
2.1 DLL0410.h
2.2 DLL0410.cpp
2.3 DLL0410.def
2.4 编辑好上面的3个文件编译后,用dumpbin命令查看是否有函数导出。
(如图所示,sub全局函数和add类的成员函数已经导出)
3.新建一个工程DLL0410test将生成的DLL0410.dll,DLL0410.lib以及DLL0410.h文件拷贝到 DLL0410test工程目录下
4.静态调用:在工程的DLL0410test.cpp文件中导入头文件DLL0410.h,并编写对应的静态调用代码。
同时也要在工程属性链接中加入DLL0410.lib文件。
(如果编译出错有可能是,工程属性中的常规>>字符集>>修改为 使用多字节字符集)
运行成功
5.4.动态调用:只需将生成的DLL0410.dll文件拷贝到新建工程目录下,直接在工程的
DLL0410test.cpp中编写动态调用代码即可。
不用做其他任何连接和导入头文件的操作。
运行成功。