【MFC实践】基于MFC向导C++制作计算器(附文件)

  • 一、写在前面
    • 1.1 什么是MFC向导?
    • 1.2 使用MFC向导制作计算器
    • 1.3安装visual studio 2022和MFC插件
  • 二、设计计算器界面
    • 1.1 新创建MFC项目
    • 1.2 设计计算器界面
    • 1.3 添加相关变量
    • 1.4 算法的一些问题及解决方式
    • 1.5 计算功能的实现
    • 1.6 其它功能的实现
      • 1.6.1 DEL功能
      • 1.6.2 C置零功能
      • 1.6.3 Ce清除一段字符
      • 1.6.4 %百分号功能
      • 1.6.5 倒数功能
      • 1.6.6 平方功能
      • 1.6.7 开根号功能
      • 1.6.8 说明功能

一、写在前面

1.1 什么是MFC向导?

MFC(Microsoft Foundation Classes)向导是一套用于简化Windows应用程序开发的工具集。 它建立在Microsoft Foundation Classes(MFC)之上,为开发人员提供了一种更直观、高效的方式来构建图形用户界面(GUI)应用程序。MFC向导通过提供可视化设计工具、代码生成器等功能,使得开发者能够更专注于业务逻辑的实现,而不必过多关注繁琐的界面布局和控件创建。

1.2 使用MFC向导制作计算器

计算器项目相对简单,但涉及到了UI设计、事件处理、C++编程等方面,是一个适合初学者的实践项目。通过使用MFC向导,能够快速创建一个具有良好界面和基本功能的计算器,同时学会如何使用可视化工具来简化开发过程。以下是计算器项目示例图:
在这里插入图片描述

1.3安装visual studio 2022和MFC插件

对于未安装visual studio,下载地址:visual studio 2022 下载传送门,正常安装后,点击继续但无需代码的方式打开,在工具栏点击工具->获取工具和功能->已安装->修改
在这里插入图片描述
点击单个组件,找到图示两项并勾选,最后点击窗口右下方的修改即可
在这里插入图片描述

二、设计计算器界面

1.1 新创建MFC项目

首先基于MFC向导生成对话框文档(也可以选择单文件文档,但需要另建并加载对话框资源,看个人需求),对于初学者,建议可以取消勾选高级功能中的“公共控件清单、支持重启管理器”(不用增加额外非必要的代码),对于“文档模板属性”和“用户界面功能”默认即可。默认生成主要有主类的头文件MFCApplication1对话框资源文件IDD_MFCAPPLICATION1_DIALOG。文件名可根据需要修改,这里只是默认文件名为例子。
在这里插入图片描述

1.2 设计计算器界面

工具栏选择Button、Edit Control分别添加按钮、文本框等控件,鼠标选中拖动进行布局,以下是一些简单的布局技巧

布局方式描述
Shift多选对齐使用MFC的设计器,你可以通过按住Shift键选择多个控件,然后在属性窗口中设置它们的位置和大小,以实现对齐。
工具栏描述
MFC设计器Visual Studio自带的MFC设计器是一个强大的工具,可用于直观地设计和布局界面。
控件对齐工具MFC设计器中的对齐工具可用于快速将选定的控件水平或垂直对齐,确保它们在界面上整齐排列。
网格布局在MFC中,你可以使用网格布局管理器来自动调整控件的大小和位置,使它们在窗口中均匀分布。
代码编辑器通过在代码中手动编辑控件的位置和大小,你可以更精细地控制布局。
调整控件层次结构通过在层次结构视图中调整控件的嵌套关系,可以影响它们在窗口中的布局。

布局方式就不在这赘述,懂得如何画就行,使用工具栏和工具箱完成布局和控件的添加,示例样式如下
在这里插入图片描述

1.3 添加相关变量

都知道,计算器需要一个变量来存储用户输入的表达式,输入的对象是文本编辑器,故此,应需要为文本编辑器添加一个变量,且该变量的类型应是CString(字符串类,MFC对C++标准库中的字符串类的一个扩展),但变量在类文件声明,所以在这之前应该为对话框资源添加对应的类文件MFCApplication1Dlg(类名可修改):右键对话框->添加类
在这里插入图片描述

创建类之后,点击工具栏的项目->类向导->成员变量,找到编辑框的那项(本例中ID默认为IDC_Edit2),选中该项右键->添加变量,变量名和类型如下图
在这里插入图片描述
变量添加完成后,就可以在对话框类文件MFCApplication1Dlg看到变量m_data
在这里插入图片描述

1.4 算法的一些问题及解决方式

接下来就是针对每个按钮写入相应消息事件,双击每个按钮跳转对话框实现文件MFCApplication1Dlg.cpp并生成对应函数(函数名与控件ID同名)。m_data变量用于存储用户输入的表达式,对于0-9和运算符按钮控件,事件分别对应不同的值输入,并且m_data是CString类型,那么可以使用下标法在字符串表达式的末尾增字符,简单示例如下:

m_data+='0'
m_data+='1'
m_data+='2'
m_data+='3'
m_data+='4'
m_data+='5'
m_data+='6'
m_data+='7'
m_data+='8'
m_data+='9'
m_data+='.'
m_data+='+'
m_data+='-'
m_data+='*'
m_data+='/'

每次在m_data末尾增设字符,首先需要更新编辑框的内容到变量m_data

UpdateData();

然而有以下几个问题以及应对解决代码(这里新建数组a作中间变量,i作下标),带着这些问题来设计算法,以便理解。

  • 问题1:计算器默认m_data值为0,那么在0之后的第一个字符若为数字字符,则应该覆盖0,比如控件按钮1的代码示例
UpdateData();
if (m_data == "0")
{i--;//下标向前指向0的位置a[i] = "1";m_data = a[i];//覆盖0
}
else
{a[i] = "1";m_data += a[i];//直接追加
}
i++
  • 问题2:若表达式最后一个字符是运算符的一种(+、- 、*、/),则一个字符不能是运算符。对于该问题可以设置一个控制变量f,置初值为1,表示可以追加运算符。
//当点击运算符按钮,置f为0。
f=0;
//当点击除运算符以外的按钮,则重新置f为1。
f=1;
  • 问题3:对于运算符’.'也有同样的问题即不能连用,这里设置控制变量pd来互斥。
//当点击小数点按钮,置pd为1。
f=1;
//当点击除小数点按钮以外的按钮,则重新置f为0。
f=0;
  • 问题4:小数点按钮和运算符按钮事件也应该相互制约
//当表达式最后一个字符是运算符,若要添加小数点则应先追加0
if (a[i - 1] == "+" || a[i - 1] == "-" || a[i - 1] == "*" || a[i - 1] == "/")
{a[i] = "0";m_data += a[i];//先追加0i++;a[i] = ".";m_data += a[i];//再追加小数点
}
else
{a[i] = ".";m_data += a[i];//直接追加小数点
}
i++;
f = 0;
//当表达式最后一个字符是小数点,若要添加运算符则应覆盖小数点
//比如加法,其它运算符按钮响应事件也如此
if (a[i - 1] == ".")
{i--;a[i] = "+";// 获取最后一个字符的索引int lastIndex = m_data.GetLength() - 1;// 替换最后一个字符为 '+'m_data.SetAt(lastIndex, _T('+'));//覆盖
}
else
{a[i] = "+";m_data += a[i];//直接追加
}
f = 1;
i++;

1.5 计算功能的实现

变量m_data是CString类型,用于存储计算表达式,包含加减乘除运算符和小数点符号,对于运算优先级的处理方式:首先定义三个变量用于下标取值p、left、right。外循环p获取m_data字符串的乘除运算符,内循环left和right分别指向p所指向运算符左右两侧的运算符,用m_data.Mid()函数截取p所指运算符两侧的数字,根据判断p指向的运算符进行乘法或者除法运算,最后使用m_data.Delete()和 m_data.Insert()函数替换运算结果。

void CMFCApplication1Dlg::OnBnClickedEqual()
{int length = m_data.GetLength();int left = 0, right = 0, p = 0;//先乘除for (p = 0; p < length; p++){if (m_data.GetAt(p) != '+' && m_data.GetAt(p) != '-' && m_data.GetAt(p) != '.' && m_data.GetAt(p) < '0' || m_data.GetAt(p) > '9'){left = p - 1;right = p + 1;while (left >= 0){if (m_data.GetAt(left) == '0' || m_data.GetAt(left) == '1' || m_data.GetAt(left) == '2' || m_data.GetAt(left) == '3' || m_data.GetAt(left) == '4' || m_data.GetAt(left) == '5' || m_data.GetAt(left) == '6' || m_data.GetAt(left) == '7' || m_data.GetAt(left) == '8' || m_data.GetAt(left) == '9' || m_data.GetAt(left) == '.'){left--;}else break;}while (right < length){if (m_data.GetAt(right) == '0' || m_data.GetAt(right) == '1' || m_data.GetAt(right) == '2' || m_data.GetAt(right) == '3' || m_data.GetAt(right) == '4' || m_data.GetAt(right) == '5' || m_data.GetAt(right) == '6' || m_data.GetAt(right) == '7' || m_data.GetAt(right) == '8' || m_data.GetAt(right) == '9' || m_data.GetAt(right) == '.'){right++;}else break;}}else continue;CString a = m_data.Mid(left + 1, p - left - 1);CString b = m_data.Mid(p + 1, right - p - 1);double temp = 0.0;if (m_data.GetAt(p) == '*'){temp = _ttof(a) * _ttof(b);//类型转换CString t;t.Format(_T("%0.4f"), temp);m_data.Delete(left + 1, right - left - 1);m_data.Insert(left + 1, t);UpdateData(false);UpdateData();length = m_data.GetLength();p = 0;}if (m_data.GetAt(p) == '/'){temp = _ttof(a) / _ttof(b);//类型转换CString t;t.Format(_T("%0.4f"), temp);m_data.Delete(left + 1, right - left - 1);m_data.Insert(left + 1, t);UpdateData(false);UpdateData();length = m_data.GetLength();p = 0;}AfxMessageBox(a + "和" + b);}//后加减for (p = 0; p < length; p++){if (m_data.GetAt(p) != '*' && m_data.GetAt(p) != '/' && m_data.GetAt(p) != '.' && m_data.GetAt(p) < '0' || m_data.GetAt(p) > '9'){left = p - 1;right = p + 1;while (left >= 0){if (m_data.GetAt(left) == '0' || m_data.GetAt(left) == '1' || m_data.GetAt(left) == '2' || m_data.GetAt(left) == '3' || m_data.GetAt(left) == '4' || m_data.GetAt(left) == '5' || m_data.GetAt(left) == '6' || m_data.GetAt(left) == '7' || m_data.GetAt(left) == '8' || m_data.GetAt(left) == '9' || m_data.GetAt(left) == '.'){left--;}else break;}while (right < length){if (m_data.GetAt(right) == '0' || m_data.GetAt(right) == '1' || m_data.GetAt(right) == '2' || m_data.GetAt(right) == '3' || m_data.GetAt(right) == '4' || m_data.GetAt(right) == '5' || m_data.GetAt(right) == '6' || m_data.GetAt(right) == '7' || m_data.GetAt(right) == '8' || m_data.GetAt(right) == '9' || m_data.GetAt(right) == '.'){right++;}else break;}}else continue;CString a = m_data.Mid(left + 1, p - left - 1);CString b = m_data.Mid(p + 1, right - p - 1);double temp = 0;if (m_data.GetAt(p) == '+'){temp = _ttof(a) + _ttof(b);//类型转换CString t;t.Format(_T("%0.4f"), temp);m_data.Delete(left + 1, right - left - 1);m_data.Insert(left + 1, t);UpdateData(false);UpdateData();length = m_data.GetLength();p = 0;}if (m_data.GetAt(p) == '-'){temp = _ttof(a) - _ttof(b);//类型转换CString t;t.Format(_T("%0.4f"), temp);m_data.Delete(left + 1, right - left - 1);m_data.Insert(left + 1, t);UpdateData(false);UpdateData();length = m_data.GetLength();p = 0;}AfxMessageBox(a + "和" + b);}
}

1.6 其它功能的实现

1.6.1 DEL功能

作用删除表达式的上一个字符

void CMFCApplication1Dlg::OnBnClickedDel()
{UpdateData();  // 更新 m_data 长度// 获取当前的字符串长度int length = m_data.GetLength();// 检查字符串是否为空if (length > 0){// 如果字符串长度大于1,删除最后一个字符if (length > 1){a[i] = '\0';m_data.Delete(length - 1, 1);}else{// 如果字符串只剩最后一个字符,将m_data设置为"0"a[i] = '0';m_data = _T("0");}// 更新界面上的文本框等显示UpdateData(FALSE);}f = 0;pd = 0;UpdateData(false);
}

1.6.2 C置零功能

void CMFCApplication1Dlg::OnBnClickedC()
{m_data = "0";//置零UpdateData(false);
}

1.6.3 Ce清除一段字符

void CMFCApplication1Dlg::OnBnClickedCe()
{// TODO: 在此添加控件通知处理程序代码int p = m_data.GetLength()-1;while (p>=0){if (m_data.GetAt(p) == '+' || m_data.GetAt(p) == '-' || m_data.GetAt(p) == '/' || m_data.GetAt(p) == '*'){break;}p--;}m_data.Delete(p+1, m_data.GetLength() - 1-p);UpdateData(false);
}

1.6.4 %百分号功能

void CMFCApplication1Dlg::OnBnClickedFeature6()
{int p = m_data.GetLength() - 1;while (p >= 0){if (m_data.GetAt(p) == '+' || m_data.GetAt(p) == '-' || m_data.GetAt(p) == '/' || m_data.GetAt(p) == '*'){break;}p--;}CString a = m_data.Mid(p + 1, m_data.GetLength() - 1 - p);m_data.Delete(p + 1, m_data.GetLength() - 1 - p);double b = _ttof(a) * 0.01;a.Format(_T("%f"), b);m_data.Insert(p + 1, a);UpdateData(false);
}

1.6.5 倒数功能

void CMFCApplication1Dlg::OnBnClickedFeature3()
{int p = m_data.GetLength() - 1;while (p >= 0){if (m_data.GetAt(p) == '+' || m_data.GetAt(p) == '-' || m_data.GetAt(p) == '/' || m_data.GetAt(p) == '*'){break;}p--;}CString a = m_data.Mid(p + 1, m_data.GetLength() - 1 - p);m_data.Delete(p + 1, m_data.GetLength() - 1 - p);double b =1/ _ttof(a) ;a.Format(_T("%f"), b);m_data.Insert(p + 1, a);UpdateData(false);
}

1.6.6 平方功能

void CMFCApplication1Dlg::OnBnClickedFeature4()
{// TODO: 在此添加控件通知处理程序代码int p = m_data.GetLength() - 1;while (p >= 0){if (m_data.GetAt(p) == '+' || m_data.GetAt(p) == '-' || m_data.GetAt(p) == '/' || m_data.GetAt(p) == '*'){break;}p--;}CString a = m_data.Mid(p + 1, m_data.GetLength() - 1 - p);m_data.Delete(p + 1, m_data.GetLength() - 1 - p);double b = _ttof(a) * _ttof(a);a.Format(_T("%f"), b);m_data.Insert(p + 1, a);UpdateData(false);
}

1.6.7 开根号功能

void CMFCApplication1Dlg::OnBnClickedFeature5()
{// TODO: 在此添加控件通知处理程序代码int p = m_data.GetLength() - 1;while (p >= 0){if (m_data.GetAt(p) == '+' || m_data.GetAt(p) == '-' || m_data.GetAt(p) == '/' || m_data.GetAt(p) == '*'){break;}p--;}CString a = m_data.Mid(p + 1, m_data.GetLength() - 1 - p);m_data.Delete(p + 1, m_data.GetLength() - 1 - p);double b = sqrt(_ttof(a)) ;a.Format(_T("%f"), b);m_data.Insert(p + 1, a);UpdateData(false);
}

1.6.8 说明功能

void CMFCApplication1Dlg::OnBnClickedFeature1()
{MessageBox("1. 百分比计算(%)\n输入一个数字,然后使用百分号(% )进行百分比计算。计算器将返回输入数的百分之一。\n2. 删除字符或运算符(del)\n通过按下“del”按钮,可以删除最后一个输入的字符或运算符。这有助于纠正输入错误。\n3. 清零(C)\n按下“C”按钮将清空当前输入的所有内容,使计算器重置为零状态。\n4. 清除最后一个数(CE)\n使用“CE”按钮可以清除输入的最后一个数字,保留其他输入和运算符。");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于白盒测试,这些技巧你得游刃有余~

对于很多刚开始学习软件测试的小伙伴来说&#xff0c;如果能尽早将黑盒、白盒测试弄明白&#xff0c;掌握两种测试的结论和基本原理&#xff0c;将对自己后期的学习有较好的帮助。今天&#xff0c;我们就来聊聊黑盒、白盒测试的相关话题。 1、黑盒测试的方法和小结 最常见黑盒…

C++标准学习--多线程

在以往多线程的实现的时候&#xff0c;都是自己去亲自创建线程&#xff0c;采用特殊flag 及锁控制线程的运转状态。这无可厚非&#xff0c;但又似乎有重复造轮子的嫌疑。最近发现了一个线程池的轮子&#xff0c;很不错&#xff0c;ZZ一下。 C多线程线程池&#xff08;全详解&a…

免费学习鸿蒙(HarmonyOS)开发,一些地址分享

HarmonyOS万物互联&#xff0c;从华为一系列的操作来看已经与iOS、Android形成三足鼎立之势了。 根据《澎湃新闻》的报道&#xff0c;已有23所985高校和46所211高校加入了鸿蒙班的行列&#xff0c;合计达到了69所国内一流高校。通过鸿蒙班的设立&#xff0c;高校可以为学生提供…

【Java】正则表达式( Pattern 和 Matcher 类)

快速入门 Java 提供了 java.util.regex 包&#xff0c;它包含了 Pattern 和 Matcher 类&#xff0c;用于处理正则表达式的匹配操作。 java.util.regex 包主要包括以下三个类&#xff1a; Pattern 类&#xff1a; pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共…

从Scroll怒喷社区用户事件,看L2龙头ZKFair的做事格局

这两天&#xff0c;随着美国SEC正式批准所有11只比特币现货ETF的消息公布&#xff0c;吸引了传统主流增量资金的入场&#xff0c;比特币多头一举将比特币干到了48000刀的位置&#xff0c;并随时向着前高发起了冲击。比特币的强势带动了其他加密资产的保障&#xff0c;整个加密市…

面试常见问题回答干货

1、请你自我介绍一下你自己&#xff1f; 回答提示&#xff1a;一般人回答这个问题过于平常&#xff0c;只说姓名、年龄、爱好、工作经验&#xff0c;这些在简历上都有。其实&#xff0c;企业最希望知道的是求职者能否胜任工作&#xff0c;包括&#xff1a;最强的技能、最深入研…

基于elementUI封装的带复选框el-checkbox的下拉多选el-select组件

效果图&#xff1a; 组件&#xff1a;MultipleSelect.vue <template><el-select v-model"selectValues" v-bind"$attrs" v-on"listeners" multiple placeholder"请选择" style"width: 50%" change"changeSel…

kylin4.0.3升级问题

话接前文&#xff1a; kylin升级(3.0.1-&#xff1e;kylin-4.0.3)-CSDN博客文章浏览阅读941次&#xff0c;点赞29次&#xff0c;收藏12次。原本的cube太多了&#xff0c;换其他OLAP数据库太麻烦。相比之下&#xff0c;升级是一个很好的选择&#xff08;官网有说明内存降低和构…

玩转“资本腾挪之术”,戴震的能链版图扩至何处?

在当下经济恢复发展缓慢&#xff0c;以及消费市场需求疲软的大环境下&#xff0c;企业融资变得越来越艰难。 但即便如此&#xff0c;仍有个别企业却独得众多资本大鳄青睐&#xff0c;这家企业就是能链集团。据不完全统计&#xff0c;2016年成立至今&#xff0c;能链集团已经完…

一站式搞定文案生成、违规检测、一键分发的全流程

随着社交媒体的不断发展&#xff0c;越来越多的企业开始布局新媒体矩阵&#xff0c;从集团总部到区域门店、个人销售&#xff0c;从全品类到细分垂直类目、从单一平台到多平台&#xff0c;试图让品牌影响力覆盖更广泛群体&#xff0c; 当然&#xff0c;随之而来的&#xff0c;如…

砥砺深耕,历伴童行 ——南阳人人社工2022年度未保项目结项回顾

未成年人的健康成长&#xff0c;关乎国家未来和民族兴旺。2023年&#xff0c;南阳市人人社会工作服务中心在南阳市民政局的指导下&#xff0c;坚持党建引领未成年人保护服务&#xff0c;紧紧围绕“保权益&#xff0c;促发展&#xff0c;育新人”的使命任务&#xff0c;以最有利…

蓝桥杯单片机组备赛——蜂鸣器和继电器的基本控制

文章目录 一、蜂鸣器和继电器电路介绍二、题目与答案2.1 题目2.2 答案2.3 重点函数解析 一、蜂鸣器和继电器电路介绍 可以发现两个电路一端都接着VCC&#xff0c;所以我们只要给另一端接上低电平就可以让蜂鸣器和继电器进行工作。与操作LED类似&#xff0c;只不过换了一个74HC5…

爬虫之使用代理

爬虫—使用代理 1. 为什么使用代理 1.1 让服务器以为不是同一个客户端在请求 1.2 防止我们的真实地址被泄漏&#xff0c;防止被追究 2. 理解使用代理的过程 3. 理解正向代理和反向代理的区别 通过上图可以看出&#xff1a; 正向代理&#xff1a;对于浏览器知道服务器的真实…

vue前端开发自学demo,父子组件之间传递数据demo2

vue前端开发自学demo,父子组件之间传递数据demo2!实际上&#xff0c;组件之间传递数据的&#xff0c;数据类型&#xff0c;是可以多种多样的&#xff0c;下面为大家展示几个常见的数据类型&#xff0c;比如数字类型&#xff0c;数组类型&#xff0c;对象类型。 代码如下所示&a…

Linux Debian12系统gnome桌面环境默认提供截屏截图工具gnome-screenshot

一、简介&#xff1a; 在Debian12中系统gnome桌面环境默认提供一个截图捕获工具screenshot,可以自定义区域截图、屏幕截图、窗口截图和录制视频&#xff0c;截图默认保存在“~/图片/截图”路径下。 可以在应用程序中搜索screenshot,如下图&#xff1a; 也可以在桌面右上角找到…

算法进阶——按之字形顺序打印二叉树

题目 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09;。 数据范围&#xff1a;0≤n≤1500,树上每个节点的val满足∣val∣<1500 要求&#xff1a;空间复杂…

物理机搭建hive

一、修改Hadoop配置 修改core-site.xml 配置yarn-site.xml 分发文件&#xff0c;然后重启集群 二、 Hive解压安装 上传文件 添加hive环境便量&#xff0c;source生效 启动高可用集群&#xff0c;启动hive 三、配置mysql元数据库 检查当前系统是否安装过Mysql&#xf…

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(七)

08.什么是模块化&#xff1f; CommonJS 标准 09.ECMAScript 标准 - 默认导出和导入 10.ECMAScript 标准 - 命名导出和导入 11.包的概念 实操&#xff1a; server.js utils/lib/index.js utils/package.json 12.npm - 软件包管理器 13.npm - 安装所有依赖 从别处&#xff08;网…

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

计算机缺失msvcp140.dll的修复教程,教你快速解决dll问题

“针对计算机系统中出现的msvcp140.dll文件丢失问题&#xff0c;小编将详细阐述一系列有效的解决方法。首先&#xff0c;msvcp140.dll是Microsoft Visual C Redistributable Package中的一个关键动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当系统提示该文…