使用 MFC 类编写的应用程序是不是需要安装外部框架
Posted
技术标签:
【中文标题】使用 MFC 类编写的应用程序是不是需要安装外部框架【英文标题】:Do Applications written with MFC classes require external Frameworks to be installed使用 MFC 类编写的应用程序是否需要安装外部框架 【发布时间】:2016-01-08 12:10:32 【问题描述】:如果我使用 C++ 中的 MFC 库编写应用程序,在部署阶段我是否需要安装某种框架或类似的东西? 我的目的是拥有一个没有复杂安装脚本的独立 exe。
【问题讨论】:
所有这些都在Redistributing the MFC Library 下进行了解释。具体来说:“如果您将应用程序静态链接到 MFC(即,如果您在 中的 General 选项卡上指定 Use MFC in a Static Library属性页对话框),您不必重新分发 Mfc100u.dll 或 Mfc100.dll。” 【参考方案1】:如果您正在为自己的组织开发本地应用程序,则可以按照 Danny 的建议使用静态链接。
但静态链接不是微软推荐的方法:每次有 MFC 相关补丁(例如 here)或另一个库的 z 补丁时,您都必须重新编译代码并重新分发或重新安装它才能避免 PC 暴露于安全漏洞。
这就是为什么 Microsoft recommends to use dynamic libraries:这些更容易更新/替换(最终已经安装了最新版本;或自动 Windows 更新;或者如果需要手动下载最新版本)。
如果你选择动态方法:
有几个mfc*.dll
与您的应用程序一起分发,以及其他标准库,例如Msvcr100.dll
。这一切都在article 中进行了解释。在your app's directory 中安装此类文件具有安装过程更精简的优点。但是您必须在必要时对他们的更新负责。
或者您选择使用Microsoft's redistribuable 包。这些可以直接从 Microsoft 下载,并包含在一个可自行安装的文件中:vc_redist*.exe
。这里对how to use them在安装过程中的一些解释。它可能会安装比所需更多的 dll,但 vc_redist 是已安装的 Microsoft 产品,它与 Windows 更新保持同步。
【讨论】:
MFC 二进制文件不是 Windows 的一部分。它们也不是自动 Windows 更新的一部分。没有官方声明暗示或明确声明 MFC 将作为 Windows 的一部分提供。此外,您永远不应该依赖某些二进制文件:始终安装所有必需的二进制文件。进入应用程序的目录。 @IInspectable 我完全同意您不应该依赖 dll 已经存在的假设。有关 Microsoft 建议使用 dll 而不是静态链接,请参阅我的答案中的链接。对于 Windows 更新 when installed with vc_redist 涵盖 MFC 的事实,THIS 安全公告中清楚地说明了这一点。当然,MFC 不会修补您本地安装在 app 文件夹中的 DLL。 安全公告谈到了一个漏洞,Microsoft Update 将专门针对此漏洞提供修复程序。这并不意味着在任何给定客户端的机器上“最终已经安装了最新版本”。 Windows is not an MFC delivery channel. @IInspectable 我认为这里有一个误解:我已经证实了你的观点,即不应依赖 dds 已经存在的假设。当我解释 dll 允许更轻松的服务时,我举了“最终有最新版本”的例子,因为如果目标 PC 上有最新版本,vc_redist 将跳过不必要的安装步骤,这将缩短用户的安装过程。但是,如果您看到更好的方法,请不要犹豫提出另一个答案:如果它很好并带来新的见解,我保证会投赞成票:-)。 我明白你想说什么。尽管如此,Microsoft 仍不建议使用 VCRedist_.exe 而不是 MFC 库的其他部署方法。手动将 DLL 安装到应用程序文件夹中的优点是,它不会触发 UAC 提示(如 VCRedist_.exe 或使用相应的合并模块的情况)。如果另一个应用程序的卸载程序错误地从系统中删除了您的任何依赖项,它也不会受到影响。【参考方案2】:如果链接MFC
statically
,则不需要外部文件。
项目设置/常规:
Use of MFC: Use MFC in a Static Library
但是,正如 Christophe 所提到的,微软并不推荐它。
【讨论】:
没错,但微软不建议这样做:对于每个影响 mfs 的安全补丁,您都必须重建您的应用程序并将其重新分发给您的客户。或者让他们暴露在漏洞中,这是不可接受的选择以上是关于使用 MFC 类编写的应用程序是不是需要安装外部框架的主要内容,如果未能解决你的问题,请参考以下文章