MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC

24 篇文章 0 订阅

前言

我们在使用Microsoft Visual Studio软件(也就是我们常常说的VS)时,其中项目属性中有一项叫做“MFC的使用”,里面包含有不同的设置,会影响我们所编写的程序的使用,今天我就遇到了这个情况,我们一起来总结一下,避免犯下相同的错误。

内容

昨天写了一个小程序,使用的是MFC应用程序的工程,工具的版本为VS2013,工程参数都是默认的,其中有一项设置叫做“MFC的使用”,默认设置是“在共享DLL中使用MFC”,我虽然看到了但是没有放在心上,编码期间解决了一个MFC使用多字节字符集报错的问题,此处不展开,后续再表,就这样程序编写完成,非常完美!交给了一个叫做“小闪电”的用户,然后她怀着万分激动地心情拿到公司电脑一使用,结果报错了!!!

这里写图片描述

“无法启动此程序,因为计算机中丢失mfc120.dll。尝试重新安装改程序以解决此问题。”,看到这个问题我首先想到的就是动态链接库的事情,因为我使用的是VS2013正好使用的是12.0版本的库文件,所以说应该是目标机上没有这个库,当然可以手动下载这个库文件,添加至“C:\Windows\System32”目录,但是在程序开发工程中,你无法要求所有的用户都会这样做,只能从自身找解决方法了。

当然我也仔细查了一下这个叫做“MFC的使用”的参数,它其实包括3个选项,具体如截图:

这里写图片描述

  1. 使用标准Windows库   
  2. 在共享DLL中使用MFC    
  3. 在静态库中使用MFC

这三种当然有着不同的意义:

  • 第一种顾名思义,是使用WINDOWS SDK API库,不使用MFC类。话说一个MFC应用程序不使用MFC类是个什么情况,一开始我也想不通,后来我新建了一个MFC应用程序的工程,然后把这这项参数填成这一种,然后程序编译失败,具体错误如下图,这就说明问题了,如果是MFC工程必须选择第二项或者第三项,而第一项“使用标准Windows库”是为非MFC工程准备的(不知理解是否正确,请大神指教)。

这里写图片描述

  • 第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。这就是我的程序一开始选择的选项,要求目标计算机中至少要包含“mfc120.dll”库文件,否则无法使用。

  • 第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行。个人感觉程序测试期间使用这个选项应该比较好,起码可以保证程序的正常运行。

总结

  • MFC应用程序的工程,关于“MFC的使用”属性,应该选择“在共享DLL中使用MFC”或者“在静态库中使用MFC”。
  • “使用标准Windows库” 选项只能用在非MFC工程中,如果用在MFC工程会导致代码编译报错。
  • “在共享DLL中使用MFC” 选项生成的程序可执行文件比较小,但是要求目标机器必须装有必要的库文件。
  • “在静态库中使用MFC” 选项生成的程序可执行文件几乎所有的Windows都可以执行,但是程序较大一些,其中包含必要的库文件,可以基本保证在别的机器上正常运行。
  • 24
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
MFC 解压 7z 文件使用 7-Zip 的静态库 "7z.lib" 时,不需要使用 "7z.dll" 文件。下面是一个示例代码: ```cpp #include "7z/7z.h" #include "7z/7zAlloc.h" #include "7z/7zFile.h" // 解压 7z 文件到指定目录 bool Extract7zFile(LPCTSTR lpszFilePath, LPCTSTR lpszTargetPath) { // 打开 7z 文件 CFileInStream archiveFile; if (InFile_Open(&archiveFile.file, lpszFilePath) != 0) { return false; } // 初始化 7z 解压缩器 CLookToRead2 lookStream; LookToRead2_CreateVTable(&lookStream, false); lookStream.buf = nullptr; lookStream.bufSize = 0; lookStream.realStream = &archiveFile.vt; CDecodedFileInfo fileInfo; SzArEx_Init(&fileInfo.db); SRes res = SzArEx_Open(&fileInfo.db, &lookStream.vt, &g_Alloc, &g_Alloc); if (res != SZ_OK) { InFile_Close(&archiveFile.file); return false; } // 遍历解压缩器的所有文件 UInt32 numItems = fileInfo.db.NumFiles; for (UInt32 i = 0; i < numItems; i++) { // 获取文件名称 size_t fileNameLen; SzArEx_GetFileNameUtf16(&fileInfo.db, i, nullptr, &fileNameLen); CString fileName; fileName.GetBufferSetLength(fileNameLen); SzArEx_GetFileNameUtf16(&fileInfo.db, i, (WCHAR*)fileName.GetBuffer(), &fileNameLen); fileName.ReleaseBuffer(); // 拼接文件路径 CString filePath = lpszTargetPath; filePath += fileName; // 创建目录 CString dirPath = filePath.Left(filePath.ReverseFind('\\') + 1); if (!PathFileExists(dirPath)) { SHCreateDirectoryEx(NULL, dirPath, NULL); } // 打开输出文件流 CFileOutStream outFileStream; if (OutFile_Open(&outFileStream.file, filePath) != 0) { continue; } // 解压缩文件 UInt32 blockIndex = fileInfo.db.FileIndexToFolderIndex[i]; UInt64 unpackSize = SzArEx_GetFileSize(&fileInfo.db, i); res = SzArEx_Extract(&fileInfo.db, &lookStream.vt, blockIndex, &outFileStream.vt, &unpackSize, &g_Alloc, &g_Alloc); OutFile_Close(&outFileStream.file); if (res != SZ_OK) { continue; } } // 关闭 7z 文件 SzArEx_Free(&fileInfo.db, &g_Alloc); InFile_Close(&archiveFile.file); return true; } ``` 该示例代码使用了 7-Zip 的静态库,并通过调用其提供的函数实现了 7z 文件的解压缩。 需要注意的是,为了正确使用 7-Zip 的静态库,需要将 "7z.lib" 文件添加到项目,并将其路径添加到项目属性的 "VC++ 目录" 和 "链接器 -> 输入 -> 附加依赖项" 。同时,还需要包含 "7z" 目录下的头文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertS

常来“玩”啊~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值