【问题标题】:What is Different Between "MFC DLL" and "Console Application DLL"?“MFC DLL”和“控制台应用程序 DLL”有什么不同?
【发布时间】:2022-06-10 18:13:56
【问题描述】:

从 Visual Studio 向导创建 MFC DLL 与创建 C++ 控制台应用程序并将配置类型更改为 DLL 而不是 .exe 有什么区别?

【问题讨论】:

  • 我的猜测是MFC是用来创建窗口应用的,另一个是用来创建控制台应用的。
  • @tho 你猜错了。以 CONSOLE 子系统为目标的应用程序与以 WINDOWS 子系统为目标的应用程序之间没有根本区别。任何一个都可以访问相同的 Win32 API 表面。虽然 MFC 经常用于实现带有 GUI 的应用程序,但 MFC 中有许多非 GUI 工具(例如 CAsyncSocketCWinThread)。此外,这个问题询问的是 DLL、库,所以这甚至与应用程序无关。
  • 那么这意味着当我构建一个没有窗口功能的控制台函数时,编译器会在MFC DLL中链接?

标签: c++ visual-studio visual-c++ mfc


【解决方案1】:

根据Creating an MFC DLL Project 声明:

MFC DLL 是一个二进制文件,它充当共享函数库,可供多个应用程序同时使用。创建 MFC DLL 项目的最简单方法是使用 MFC DLL 向导。

本文Kinds of DLLs还声明:

使用 Visual Studio,您可以在 C 或 C++ 中构建 Win32 DLL 使用 Microsoft 基础类 (MFC) 库。您可以创建一个 带有 Win32 应用程序向导的非 MFC DLL 项目。

MFC 库本身可用,在任一静态链接库中 或在多个 DLL 中,使用 MFC DLL 向导。如果您的 DLL 正在使用 MFC、Visual Studio 支持三种不同的 DLL 开发场景……

我相信以上解释了差异:

  • DLL 的一个版本公开了 MFC 库。
  • 一个版本没有。

这是我的理解。


其他相关文章:Create C/C++ DLLs in Visual Studio

【讨论】:

    【解决方案2】:

    应用程序(可执行)是可以运行的模块。它包含一个入口点,main()(控制台)或WinMain()(Windows GUI)函数。可执行文件的运行实例在 Win32 中称为 “进程”

    DLL 是一个供其他应用程序使用的库。它在运行时加载 - “动态”,因此得名。 DLL 不包含主入口点,而是“导出”函数甚至类和数据。缺少主入口点,DLL 不能独立运行,而是“加载到进程(应用程序的)地址空间中”。该过程可以使用他们导出的项目。这是实现常用操作的好方法,例如公司的“开发环境”或“基础”——SDK 通常以 DLL 的形式实现。

    MFC 是一个 C++ 库,包含 GUI(和其他)类和函数,主要(但不限于)包装 Win32 对象。应用程序或 DLL 可以使用 MFC 库,也可以不使用。

    至于您的问题,创建控制台应用程序然后将其更改为 DLL 是没有意义的。该向导将创建一个main() 函数,您必须手动删除该函数。最后,您将拥有一个普通的 DLL……您可以从一开始就简单地创建一个 DLL,无论它是否使用 MFC。

    【讨论】:

      【解决方案3】:

      您当然可以弄清楚如何将控制台应用程序更改为 dll 类型,但建议使用非 MFC DLL 项目模板。

      非 MFC 和 MFC 扩展 DLL 之间的一个主要区别是,它允许通过调用将对话框模板或位图等资源共享到 MFC 应用程序

        // MFC extension DLL one-time initialization
        AfxInitExtensionModule(PROJNAMEDLL, hInstance);
      
        // Insert this DLL into the resource chain
        new CDynLinkLibrary(Dll3DLL);
      

      DllMain()。其他好处是您可以使用位于 dll 中的 MFC(CObject-派生)类,并且 MFC 扩展 DLL 可以与调用实例共享内存地址空间,这意味着加载相同扩展 DLL 的两个应用程序将仅共享代码,但不会干扰分配的数据。

      请注意,您需要“共享 MFC DLL”项目设置才能使用扩展 DLL。将 MFC 静态链接到您的项目中是行不通的。因此,扩展 DLL 旨在在同时运行的不同应用程序之间共享代码,例如,但只使用一次代码内存。至少在引入扩展 DLL 时这是一个意图,但在现实世界中,不同的应用程序倾向于使用不同的版本(dll 地狱,并排)。说起: 扩展 DLL 的一个很好的用途是通过安装不同版本的 dll 来自定义应用程序(品牌、本地化)。

      延伸阅读:https://docs.microsoft.com/en-us/cpp/build/extension-dlls

      【讨论】:

        猜你喜欢
        • 2011-01-12
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2012-07-16
        • 2014-09-10
        • 1970-01-01
        相关资源
        最近更新 更多