MFC下DLL编程

上传人:枫** 文档编号:506926053 上传时间:2023-05-28 格式:DOC 页数:21 大小:1.13MB
返回 下载 相关 举报
MFC下DLL编程_第1页
第1页 / 共21页
MFC下DLL编程_第2页
第2页 / 共21页
MFC下DLL编程_第3页
第3页 / 共21页
MFC下DLL编程_第4页
第4页 / 共21页
MFC下DLL编程_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《MFC下DLL编程》由会员分享,可在线阅读,更多相关《MFC下DLL编程(21页珍藏版)》请在金锄头文库上搜索。

1、MFC下DLL编程(图解)DLL(DynamicLinkLibrary,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。DLL是应用程序的一种扩展,也是软件共享和重用的传统方法。DLL除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。而且DLL与编写它的语言无关,例如,用VC生成的规则DLL,可以被VB、Delphi等生成的应用程序使用。DLL可以用多种语言和工具编写,我们这里只介绍如何使用MFC来编写和使用DLL。相关说明文档位于MSDN帮助的“目录开发工具和语言Visu

2、alStudioVisualC+常见编程方法DLL”中。8.1基础本节先讨论DLL与静态库的区别,然后列出几种适合放置DLL的目录,最后介绍MFCDLL的三种类型。8.1.1DLL与静态链接库静态链接库Lib(StaticLinkLibrary),是在编译的链接阶段将库函数嵌入到应用程序的内部。如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。Lib的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL。而DLL采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*

3、.DLL文件,,而且只有在应用程序真正调用时,才加载到内存。在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。参见图8-1。使用动态链接库图8-1静态库函数与动态链接库的区别DLL的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL。例如,如果你的MFC项目被设置成“在共享DLL中使用MFC”的,则虽然生成的可执行程序很小,但是在其他没有安装VisualC+(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。812放置DLL的目录为了使需要动态链接库的应用程

4、序可以运行,需要将DLL文件放在操作系统能够找到的地方。Windows操作系统查找DLL的目录顺序为:1. 所在目录当前进程的可执行模块所在的目录,即应用程序的可执行文件(*.exe)所在的目录。2. 当前目录进程的当前目录。3. 系统目录Windows操作系统安装目录的系统子目录,如C:WindowsSystem32。可用GetSystemDirectory函数检索此目录的路径。4. Windows目录Windows操作系统安装目录,如C:Windows。可用GetWindowsDirectory函数检索此目录的路径。5. 搜索目录PATH环境变量中所包含的自动搜索路径目录,一般包含C:Wi

5、ndows和C:WindowsSystem32等目录。可在命令行用Path命令来查看和设置,也可以通过(在“我的电脑”右键菜单中选“属性”菜单项)“系统属性”中的环境变量,来查看或编辑“Path”系统变量和“PATH”用户变量。813MFCDLL的类型使用MFC编写的DLL,可以分成两大类:规则DLL规则(regular)DLL中所包含的函数,可以被所有Windows应用程序使用; 共享MFCDLL中不包含MFC库函数,需要另外安装MFC动态链接库后才能使用; 静态MFCDLL中包含MFC库函数,可以脱离MFC动态链接库独立使用。扩展DLL扩展(extension)DLL中所定义的类和函数,只

6、能被所MFC应用程序使用。而且扩展DLL中不能包含MFC库函数,也需要另外安装MFC动态链接库后才能使用。814导出函数的方法使用MFC创建DLL时,从项目中导出(export)函数到DLL文件的方法有:使用模块定义文件(.def)。使用_declspec(dllexport)关键字或其替代宏AFX_EXT_CLASS。这两种方法是互斥的,对每个函数只需用一种方法即可。另外,DEF文件只能用来导出函数,不能用于导出整个类。导出C+类,必须用declspec(dllexport)关键字或其替代宏AFX_EXT_CLASS。1DEF文件模块定义(moduledefinition)文件(.def)是

7、包含一个或多个描述DLL各种属性的模块语句的文本文件。DEF文件必须至少包含下列模块定义语句:文件中的第一个语句必须是LIBRARY语句。此语句将.def文件标识为属于DLL。LIBRARY语句的后面是DLL的名称(缺省为DLL项目名)。链接器将此名称放到DLL的导入库中。EXPORTS语句列出名称,可能的话还会列出DLL导出函数的序号值。通过在函数名的后面加上符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从1到N,其中N是DLL导出函数的个数。即,DEF文件的格式为:(在这两个语句之间,还可以加上可选的描述语句:DESCRIPTION库描述串。分号;后的文本内容行为注释)

8、;库名.defLIBRARY库名EXPORTS函数名1函数名212函数名nn在使用MFCDLL向导创建MFCDLL项目时,VC会自动创建一个与项目同名但没有任何函数导出项的DEF文件(项目名.def),格式为:;项目名.def:声明DLL的模块参数。LIBRARY项目名EXPORTS;此处可以是显式导出例如,项目名为RegDll的DEF文件(RegDll.def)的内容为:;RegDll.def:声明DLL的模块参数。LIBRARYRegDllEXPORTS;此处可以是显式导出如果生成扩展DLL并使用.def文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:#undefAFX_DATA

9、#defineAFX_DATAAFX_EXT_DATA/你的头文件体#undefAFX_DATA#defineAFX_DATA这些代码行确保内部使用的MFC变量或添加到类的变量是从扩展DLL导出(或导入)的。例如,当使用DECLARE_DYNAMIC派生类时,该宏扩展以将CRuntimeClass成员变量添加到类。省去这四行代码可能会导致不能正确编译或链接DLL,或在客户端应用程序链接到DLL时导致错误。当生成DLL时,链接器使用.def文件创建导出(.exp)文件和导入库(.lib)文件。然后,链接器使用导出文件生成DLL文件。隐式链接到DLL的可执行文件在生成时链接到导入库。请注意,MFC

10、本身就是使用.def文件从MFCxO.dll导出函数和类的。2关键字或宏除了使用DEF文件来导出函数外,还可以在源程序中使用declspec(dllexport)关键字或其替代宏AFX_EXT_CLASS:#defineAFX_EXT_CLASSAFX_CLASS_EXPORT(定义在头文件afxv_dll.h中)#defineAFX_CLASS_EXPORT_declspec(dllexport)(定义在头文件afxver_.h中)来导出函数和整个C+类。具体的格式为:导出整个类:classAFX_EXT_CLASS类名:public基类导出类的成员函数:class类名:public基类AF

11、X_EXT_CLASS返回类型函数名1();AFX_EXT_CLASS返回类型函数名2();导出外部C格式的(全局)函数:externC_declspec(dllexport)返回类型函数名()如果希望用MFC(C+)编写的规则DLL中的函数,也能够被非MFC程序来调用,需要为函数声明指定externC。不然,C+编译器会使用C+类型安全命名约定(也称作名称修饰)和C+调用约定(使用此调用约定从C调用会很困难)。为了使用方便,可以定义宏:#defineDllExportexternC_declspec(dllexport)然后再使用它,例如:DllExportintAdd(intd1,intd

12、2)82扩展DLL使用MFC编写的扩展DLL,可以导出整个类(从而能使用类中的所有成员,包括数据成员和成员函数),也可以导出指定的若干(成员或全局)函数。下面我们通过一个四则运算的例子,看看如何用宏AFX_EXT_CLASS来编写和使用导出整个C+类的扩展MFCDLL。821创建DLL项目我们创建一个名为ExtDll的扩展DLL的“VisualC+”之“MFC”的“MFCDLL”项目,注意需选中“创建解决方案的目录”复选框,参见图8-2。DLL”单选钮,参见图8-3。按“完成”钮,创建ExtDll解决方案和项目。8.2.2添加导出类为新项目添加用于四则计算的导出类CCompute。方法有多种,

13、可以在项目管理区的“类视图”页中,选中项目名“ExtDll”,按鼠标右键,在弹出菜单中选“添加类”。在弹出的“添加类”对话框中,选择“VisualC+”之“MFC”的“MFC类”项,参见图8-4。添加类-EztDllSVieu:i1C+CUIEATLC+智能设备isnalStudio已安装的模槻ActiveX控件中的MFC类显FC类養的模板噩MFCODBC使用者TypeLib中的MFC类祐搜索联机模板.添加Microsoft基础类库类图8-4添加类对话框浏览名称:位置:取消按“添加”钮,弹出“MFC类向导”对话框。在“类名”栏中键入“CCompute”,在“基类”下拉式列表,选“CObject

14、”,参见图8-5。按“完成”钮,添加该类到ExtDll项目。些-8.2.3编写导出类代码我们将整个CCompute类设为导出类,并在里面添加2个成员变量、1个构造函数和4个用于四则运算的成员函数,外加1个演示导出函数的取模全局函数Mod。下面是CCompute类的头文件(Compute.h),其中红色的部分是自己添加:(注意导出宏AFX_EXT_CLASS的使用)#pragmaonce/CCompute命令目标classAFX_EXT_CLASSCCompute:publicCObjectpublic:intm_data1,m_data2;public:CCompute();CCompute(intd1,intd2);virtualCCompute();public:intAdd();intSub();intMul();doubleDiv();AFX_EXT_CLASSintMod(intd1,intd2);下面是CCompute类的代码源文件(Compute.cpp),其中红色为自己添加的部分:/Compute.cpp:实现文件/#includestdafx.h#includeC

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号