四种DLL:NON-MFC DLL, Regular DLL Statically/Dynamically Linked to MFC, MFC Extension DLL

参考资料:

https://msdn.microsoft.com/en-us/library/30c674tx.aspx

在上面给出的MSDN链接中,你可以看到四种DLL的定义。这里就不赘述。捡重点的说

区别就在于:

  • NON-MFC DLL内部不能使用MFC(当然其导出的API也不能涉及MFC)。(这里我说“导出的API”是指导出的C函数、C++类或者共享的全局变量等等)
  • Regular DLL Statically/Dynamically linked to MFC内部可以使用MFC,但是其导出的API不能涉及MFC(比如说涉及到MFC的某个类或其子类,包括你写的MFC的子类,以及任何没有在该DLL中运行的MFC代码;说人话,就是任何涉及MFC的代码都只能在DLL内部运行,如果你从DLL中导出,再由其他的EXE或者DLL运行,是不行的。)当然,根据该DLL是动态链接到MFC库还是静态链接到MFC库又细分成了两种。
  • MFC Extension DLL内部可以使用MFC,并且其导出的API也可以涉及MFC。
  • 可以看到,从NON-MFC DLL到MFC Extension DLL,其可使用的功能越来越多。NON-MFC DLL可以导出C函数,全局变量,普通的C++类,但不能涉及MFC;Regular DLL具备NON-MFC DLL的所有能力,并且其内部可以使用MFC,但不能将涉及MFC的部分导出;MFC Extension DLL具备Regular DLL的所有能力,并且可以导出使用MFC的API。

1、如何在VS中创建四种DLL的项目

1.1、NON-MFC DLL

新建项目>VC++>Win32>Win32项目>选择DLL

1.2、Regular DLL Statically/Dynamically linked to MFC

新建项目>VC++>MFC>MFC DLL>选择Statically linked to MFC / Dynamically linked to MFC

1.3、MFC Extension DLL

新建项目>VC++>MFC>MFC DLL>选择MFC Extension DLL

DLLDEMO项目:

举例说明了NON-MFC DLL(AddXxx.dll):导出了C函数,全局变量,非MFC的C++类。

举例说明了Regular DLL Dynamically linked to MFC(Add.dll):导出了C函数,其内部使用MFC创建了一个对话框。

举例说明了MFC Extension DLL(AddExt.dll):导出了C函数,MFC子类,该子类是一个对话框。

测试程序:FontView,点击Print Sample按钮可以测试三种DLL,相关代码在CMainWindow::OnPushButtonClicked中可以看到

下载地址:下载DLLDEMO(待更新)

备注:

在编写AddExt.dll的代码的时候,由于没仔细看MSDN中的说明,在InfoDlgFactoryExt中使用了AFX_MANAGE_STATE从而导致了LNK2005错误(error LNK2005: [email protected] already defined in dllmain.obj)。实际上MFC Extension DLL用不着这个,AFX_MANAGE_STATE是拿给使用了MFC的Regular DLL的。

时间: 2024-07-30 20:20:59

四种DLL:NON-MFC DLL, Regular DLL Statically/Dynamically Linked to MFC, MFC Extension DLL的相关文章

MFC的亚博静态库.lib、体育动态库.dll以及Unicode库示例

MFC亚博静态库使用下列体育命名约定: uAFXcWd.LIB . 库命名约定的说明符如下: 说明符 值和含义u (n) ANSI 或 (u)Unicodec 创建的计划类型:c=alld d=debug版本; release版本略去说明符默认值为生成用于 Intel 平台的调试版本 windows ANSI 应用程序的静态库:NAFXCWD.Lib. 下表列出的所有库是在 \ atlmfc \ lib 目录中包含预生成的静态库. 静态链接库命名约定: 库 说明NAFXCW.LIB MFC 静态

MFC 在对话框显示图片的多种方法(四种方法)

我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对话框类为CTestDlg (一) 非动态载入图片. 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点击打开属性, 将type下拉框选择B

WinDbg常用命令系列---.load, .loadby (Load Extension DLL)

.load, .loadby (Load Extension DLL) 简介 .load和.loadby命令将新的扩展DLL加载到调试器中. 使用形式 .load DLLName !DLLName.load .loadby DLLName ModuleName 参数 DLLName 指定要加载的调试器扩展DLL.如果使用.load命令,DLLName应包含完整路径.如果使用.loadby命令,DLLName应仅包含文件名. ModuleName 指定与DLL name指定的扩展DLL位于同一目录

Delphi 2010 里公开的 Midas.dll 的源代码!!Delphi 2010 V14.0.3449.21988 的Midas.dll 修正了上一版本的大BUG!

源代码是用C++ Builder写的. 下载: http://files.cnblogs.com/AnyDelphi/Midas_Source.rar http://www.cnblogs.com/AnyDelphi/archive/2009/08/13/1545175.html#2264357 上一版本的Midas.dll Delphi 2007编译的程序如果是用Delphi 2010的Midas.dll是会出错的. 这一版就不会了. http://www.cnblogs.com/AnyDel

Mono加密DLL也没用,借助IDA dump内存 直接提取解密后的DLL,反编译破解Unity游戏

之前有介绍过通过重新编译Mono 来加密DLL的方式,来避免Unity 游戏被反编译修改破解,然而这种方式只能防住一些小白玩家,稍微有技术的玩家分分钟就破解了,下面也介绍下一个Unity游戏是如何被破解的. 首先,对于没有重编Mono 进行加密的,直接找到DLL,反编译修改代码就搞定,详细请参照我之前写的文章 Unity3d 反编译破解游戏 简单示例 (使用ildasm反编译DLL修改然后重新编译DLL) 然后对于重编Mono进行加密过的,可以借助IDA来破解,如下: 转自http://blog

.Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?

什么是Dll? DLL 是一个包含可由多个程序同时使用的代码和数据的库. 例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数.因此,每个程序都可以使用该Dll中包含的功能来实现"打开"对话框.这有助于促进代码重用和内存的有效使用.通过使用 DLL,程序可以实现模块化,由相对独立的组件组成.通俗来讲,一个项目由多个模块组成.可以在运行时将各个模块加载到主程序中(如果安装了相应模块).因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功

控件绘制的四种方法

OWNER?DRAW实现自绘按钮 一准备工作 在您决定开发 Windows 提供的常规免费自定义控件范围之外的控件之后,您必需确定自己的控件将有多少独到之处 - 在功能和外观两方面.例如,我们假定您正在创建一个类似于计速表的控件.由于公共控件库 (ComCtrl32.dll) 中没有类似的控件,您完全需要自己进行以下操作:编写所有控件功能需要的代码,进行绘制,默认终端用户的交互,以及控件与其父窗口之间需要的任意消息处理. (#add 两方面,公共控件库中没有类似的 完全重写;? 只想调整公共控件

C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx.DirectSound.dll2.引入DirectX 的DLL文件的名字空间:  [C#] 纯文本查看 复制代码 ? 01 02 using Microsoft.DirectX; usingMicrosoft.DirectX.DirectSound; 3.建立设备Device dv=newDevi

使用AnimateWindow来实现窗口淡入淡出(主要有四种动画,滚动,滑动,折叠或展开,和淡入淡出)

如果是在VC6下进行编译,应引入下面的预编译宏,注意放在windows.h的前面#undef  WINVER   #define  WINVER   0x500为什么要引入上面的宏呢?看看winuser.h里面该API的声明就明白了:#if(WINVER >= 0x0500)WINUSERAPIBOOLWINAPIAnimateWindow(    HWND hWnd,    DWORD dwTime,    DWORD dwFlags);#endif /* WINVER >= 0x0500