Windows DLL动态链接库(MFC版)的创建和引用

本文将介绍Windows下DLL(动态链接库)的创建和引用。

声明:人外有人,天外有天,我的知识存在局限性,但方法一定管用。

一、生成动态链接库

这里的所谓生成动态链接库,就是为了获得三件套–".lib",".dll",".h"文件。
".lib"文件叫做“静态链接库”,它需要在程序编译的时候参与进去,因此你需要把它放在保存编译资源的文件目录下;
".dll"文件就是“动态链接库”,它需要在程序运行的时候参与进去,因此要把它放在编译后生成的“.exe”文件同一个目录下;
".h"文件就是动态链接库的头文件,这里蕴含着你开放出来的接口函数,把这个导入MFC程序,你才能操作动态链接库。

1.创建Dll工程
此处用的是VS2022community版,官网免费的,记得下载MFC的配置,这里有一篇博客

(1)打开VS2022,选择“创建新项目”
在这里插入图片描述
(2)搜索“dll”,选择“具有导出项的(dll)动态链接库”
在这里插入图片描述
(3)取好名字(HoneyDll),点“创建”
在这里插入图片描述
(4)在这里只示范创建一个最为简单的动态链接库,我们可以只操作"HoneyDll.h"和"HoneyDll.cpp"文件,目前出现的所有代码均为模板自动生成
在这里插入图片描述
(5)VS2022中文版,会对一些自带的东西做出温馨的说明,有时也会提供一些模板和例子。我们注意到在“HoneyDll.cpp”文件出现了两个例子(如下图),都出现了“HONEYDLL_API”,这个就是需要导出的标志
在这里插入图片描述
(6)“HONEYDLL_API”是在“HoneyDll.h”文件定义的
在这里插入图片描述

#ifdef HONEYDLL_EXPORTS
#define HONEYDLL_API __declspec(dllexport)//在dll工程中这个被启用
#else
#define HONEYDLL_API __declspec(dllimport)//在引用dll的工程中这个被启用
#endif

(7)同理,在类的前面添加“HONEYDLL_API”,就可以将类内的内容开放出来而不用在内容前面再添加“HONEYDLL_API”声明,此时我们可以在HoneyDll类内添加自己的函数
在这里插入图片描述
函数的内容是,返回传进来的整数的100倍的整数
在这里插入图片描述

int CHoneyDll::ReturnNum(int nNum)
{
    return nNum * 100;
}

随后Shift+Ctrl+B 编译
(8)编译成功后,需要找到三件套,首先右键选择VS内打开的“.cpp”文件或者“.h”文件,选择打开文件所在路径
在这里插入图片描述
之后会跳到头文件所在地,这是我们的的一个目标“HoneyDll.h”,直接把它复制出来就好了,新建一个文件夹来保存着三个东西
在这里插入图片描述
拿到.h文件后我们再去找lib和dll,回到有HoneyDll.sln文件的目录
在这里插入图片描述
打开该目录下的x64->Debug,然后就看到“HoneyDll.lib”和“HoneyDll.dll”了,把它们复制出来
在这里插入图片描述
(9)所需资源制作完成
在这里插入图片描述

二、创建MFC程序

1.打开VS2022,点击“创建新项目”,搜索MFC,选择“MFC应用”

在这里插入图片描述
2.起名字,点“创建”
在这里插入图片描述
随后选择“基于对话框”
在这里插入图片描述
并且把“关于框”取消勾选,这个东西实在是没什么用,然后直接点完成
在这里插入图片描述
3.创建好后会跳转到一个原始的对话框界面,我们可以把它原来的东西选中删掉,全都删完只剩一个对话框再添加自己的控件
在这里插入图片描述
3.添加自己的控件,添加两个Edit编辑框(一个输入(本金),一个输出(涨幅)),一个按钮

在这里插入图片描述
4.此程序功能简单,实现输入本金,输出本金100倍的涨幅,主要是展示动态链接库的引用

双击“翻倍”按钮,进入按钮功能编辑界面,注意,在编写MFC程序的时候,一定要看清楚控件的ID,右键控件“属性”
(1)将动态链接库的头文件复制到MFC程序里面,可以打开MFC程序的“cpp”文件的所在位置,然后就把HoneyDll.h放在这
在这里插入图片描述
然后在“解决方案管理器”新建一个“筛选器”,名为“自定义库”
在这里插入图片描述
再往“自定义库”里面添加现有项,将刚刚的“HoneyDll.h”添加进来
在这里插入图片描述
在这里插入图片描述
(2)在“HoneyDll.h”所在的目录新建一个文件夹“Tlib”用来放“HoneyDll.lib”
在这里插入图片描述
目前所作的准备,都是为了编译的时候能用上HoneyDll里的东西,还有需要最后一步,我们就可以将HoneyDll完全导入MFC程序,那就是包含头文件“HoneyDll.h”和导入指定路径的"HoneyDll.lib",在MyTinyApp.cpp操作
在这里插入图片描述

#include "HoneyDll.h"//导入头文件,

#pragma comment(lib,"Tlib/HoneyDll.lib")//指定路径,导入静态链接库

(3)之后就可以在“翻倍”按钮的函数里面使用“HoneyDll”了,双击“翻倍”按钮,进入该函数
在这里插入图片描述

void CMyTinyAppDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CHoneyDll hdll;//生成一个对象
	CString strIN;//储存输入的内容
	CString strOut;//储存输出的内容
	int nNum = 0;//输入的参数
	int nRes = 0;//接收结果

	GetDlgItemText(IDC_EDIT1,strIN);//获取“本金”的内容
	nNum = _wtoi(strIN);//将CString转化成int,_wtoi非常好用,建议收藏
	nRes=hdll.ReturnNum(nNum);//将对话框的数字传入HoneyDll,并获取结果
	strOut.Format(_T("%d"),nRes);//将int转换成CString,CString的Format非常好用,建议做笔记
	SetDlgItemText(IDC_EDIT2,strOut);//将结果显示在“涨幅”框内

}

之后把项目下面的Debug换成Release(发行版),Shift+Ctrl+B编译一下
在这里插入图片描述
然后右键随便一个cpp文件打开文件所在位置,退到有MyTinyApp.sln所在,打开x64->release目录,把“HoneyDll.dll”放在这里
在这里插入图片描述
(4)最后就可以运行程序了,你可以直接双击MyTinyApp.exe,也可以在编译器里面点击“本地Windows调试器”开始调试,在“本金”输入一个数字,“涨幅”会出来100倍于它的数字,着也就是HoneyDll里面ReturnNum函数的内容。
在这里插入图片描述

三、总结

1.选择“具有导出项的(dll)动态链接库”来创建工程;
2.用导出函数的API来修饰的内容,可以导出使用,如HONEYDLL_API
3.编译完成后,找到".h",".lib",".dll"文件(三件套);
4.将着三个文件放到MFC工程的指定位置;
5.“#include”包含头文件,用“#program comment”来导入指定路径的文件;
6.创建对象,使用函数;

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态链接库是一种可重定位的二进制文件,它包含了一些可供其他程序调用的函数或数据。在 Windows 平台上,动态链接库采用 .dll 后缀名,而在 Linux 平台上则采用 .so 后缀名。在本文中,我们将介绍如何使用 MFC 调用 C 语言编写的动态链接库。 # 创建动态链接库Windows 平台上,可以使用 Visual Studio 创建动态链接库。下面是一个简单的示例: ```c // mydll.h #ifndef MYDLL_H #define MYDLL_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) int add(int a, int b); #ifdef __cplusplus } #endif #endif // MYDLL_H // mydll.c #include "mydll.h" int add(int a, int b) { return a + b; } ``` 这个动态链接库包含一个 add 函数,可以对两个整数求和。 # 调用动态链接库MFC 项目中调用动态链接库,需要进行以下几个步骤: 1. 定义一个函数指针类型,指向动态链接库中的函数。 ```c++ typedef int (*AddFunc)(int, int); ``` 2. 加载动态链接库。 ```c++ HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } ``` 3. 获取动态链接库中的函数地址。 ```c++ AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } ``` 4. 调用动态链接库中的函数。 ```c++ int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); ``` 5. 卸载动态链接库。 ```c++ FreeLibrary(hinstLib); ``` 完整的 MFC 代码示例: ```c++ typedef int (*AddFunc)(int, int); void CMyDlg::OnButton1() { HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); FreeLibrary(hinstLib); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值