MFC教程(7)-- MFC的DLL

一般的,在介绍Windows编程的书中讲述DLL的有关知识较多,而介绍MFC的书则比较少地提到。即使使用MFC来编写动态链接库,对于初步接触DLL的程序员来说,了解DLL的背景知识是必要的。另外,MFC提供了新的手段来帮助编写DLL程序。所以,本节先简洁的介绍有关概念。

DLL的背景知识

静态链接和动态链接

当前链接的目标代码(.obj)如果引用了一个函数却没有定义它,链接程序可能通过两种途径来解决这种从外部对该函数的引用:

静态链接

链接程序搜索一个或者多个库文件(标准库.lib),直到在某个库中找到了含有所引用函数的对象模块,然后链接程序把这个对象模块拷贝到结果可执行文件(.exe)中。链接程序维护对该函数的所有引用,使它们指向该程序中现在含有该函数拷贝的地方。

动态链接

链接程序也是搜索一个或者多个库文件(输入库.lib),当在某个库中找到了所引用函数的输入记录时,便把输入记录拷贝到结果可执行文件中,产生一次对该函数的动态链接。这里,输入记录不包含函数的代码或者数据,而是指定一个包含该函数代码以及该函数的顺序号或函数名的动态链接库。

当程序运行时,Windows装入程序,并寻找文件中出现的任意动态链接。对于每个动态链接,Windows装入指定的DLL并且把它映射到调用进程的虚拟地址空间(如果没有映射的话)。因此,调用和目标函数之间的实际链接不是在链接应用程序时一次完成的(静态),相反,是运行该程序时由Windows完成的(动态)。

这种动态链接称为加载时动态链接。还有一种动态链接方式下面会谈到。

动态链接的方法

链接动态链接库里的函数的方法如下:

加载时动态链接(Load_time dynamic linking)

如上所述。Windows搜索要装入的DLL时,按以下顺序:

应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。

运行时动态链接(Run_time dynamic linking)

程序员使用LoadLibrary把DLL装入内存并且映射DLL到调用进程的虚拟地址空间(如果已经作了映射,则增加DLL的引用计数)。首先,LoadLibrary搜索DLL,搜索顺序如同加载时动态链接一样。然后,使用GetProcessAddress得到DLL中输出函数的地址,并调用它。最后,使用FreeLibrary减少DLL的引用计数,当引用计数为0时,把DLL模块从当前进程的虚拟空间移走。

输入库(.lib):

输入库以.lib为扩展名,格式是COFF(Common object file format)。COFF标准库(静态链接库)的扩展名也是.lib。COFF格式的文件可以用dumpbin来查看。

输入库包含了DLL中的输出函数或者输出数据的动态链接信息。当使用MFC创建DLL程序时,会生成输入库(.lib)和动态链接库(.dll)。

输出文件(.exp)

输出文件以.exp为扩展名,包含了输出的函数和数据的信息,链接程序使用它来创建DLL动态链接库。

时间: 2024-11-08 19:27:28

MFC教程(7)-- MFC的DLL的相关文章

MFC教程(1)--MFC概述

MFC是一个编程框架 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法.因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓.Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步

编程-c++、MFC调用labview生成的DLL

问题描述 c++.MFC调用labview生成的DLL 我用labview这个软件生成了一个前面板,labview主要用于显示仪表,现在整个面板生成为一个DLL.我想用vs C++来调用该dll,比如在MFC中一个指定的窗口中显示前面板.请熟悉这方面的大神指点一下或者和我一起讨论下vs和labview的混合编程.不甚感激! 解决方案 参考这篇文章:http://wenku.baidu.com/link?url=EOQA4viGBoEX_0ztvAa0RjYUX1lohMqvtfV3vtswGkB

我是新人,怎样实现中mfc中实现对自己DLL中回调函数的接收

问题描述 我是新人,怎样实现中mfc中实现对自己DLL中回调函数的接收 我在消息函数中执行自己的DLL中的函数.正确的话是系统会执行该函数的响应函数,可在MFC中我的响应函数未被执行,这是为什么?? 解决方案 有什么提示错误?dll没有正确加载? 解决方案二: 没有提示什么,只是我调试根本没有进入过响应函数,程序还可以正常运行 解决方案三: 没有提示什么,只是我调试根本没有进入过响应函数,程序还可以正常运行

MFC教程(13)-MFC工具条和状态栏(1)

Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar).状态栏(StatusBar).工具条提示窗口(ToolTip). Windows在一个DLL加载时注册个控制窗口的"窗口类".例如,工具条的"窗口类"是"ToolbarWindow32",状态栏的"窗口类"是"msctls_statusbar32",工具条提示窗口的"

VC精华教程:MFC入门

·VC精华教程:MFC入门系列(一) ·VC精华教程:MFC入门系列(二) ·VC精华教程:MFC入门系列(三) ·VC精华教程:MFC入门系列(四) ·VC精华教程:MFC入门系列(五) ·VC精华教程:MFC入门系列(六)

MFC教程(9)-- MFC的进程和线程(2)

下面以一个动态链接到MFC DLL的单模块应用程序为例,说明这些对象的创建过程. 当第一次访问状态信息时,比如使用 AfxGetModuleState得到模块状态,导致系列创建过程的开始,如图9-7所示. 首先分析语句pState=_afxThreadState.如果_afxThreadData.线程状态和模块状态还没有创建,该语句可以导致这些数据的创建. pState声明为CNoTrackObject对象的指针,_afxThreadState声明为一个模板CThreadLocal的实例,pSt

MFC教程(9)-- MFC的进程和线程(1)

MFC定义了多种状态信息,这里要介绍的是模块状态.进程状态.线程状态.这些状态可以组合在一起,例如MFC句柄映射就是模块和线程局部有效的,属于模块-线程状态的一部分. 模块状态 这里模块的含义是:一个可执行的程序或者一个使用MFC DLL的DLL,比如一个OLE控件就是一个模块. 一个应用程序的每一个模块都有一个状态,模块状态包括这样一些信息:用来加载资源的 Windows实例句柄.指向当前CWinApp或者CWinThread对象的指针.OLE模块的引用计数.Windows对象与相应的MFC对

将MFC Grid control封装为DLL的做法及其在DLL中的使用方法

MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图:   因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到: MFC Grid control2.27源码下载        MFC Gridcontrol的作者并没有将其封装为DLL,因为在程序的多个模块复用这个控件比较麻烦(需要在多个工程中加入其源码),因此最好将其封装为一个DLL.今天有同事反映在DLL的对话框中无法使用封装好的MFC Grid control,于是上网查了下资料,晚上摸索了一

MFC教程(4)-- 消息映射的实现(2)

但是在当前例子中,当前对象的类CTview没有覆盖该函数,所以CWnd的WindowProc被调用. 这个函数把下一步的工作交给OnWndMsg函数来处理.如果OnWndMsg没有处理,则交给DefWindowProc来处理. OnWndMsg和DefWindowProc都是CWnd类的虚拟函数. OnWndMsg的原型如下: BOOL CWnd::OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam,RESULT*pResult ); 该函数