MFC 教程 第13章动态链接库_

合集下载

MFC动态链接库的创建和调用(类和函数的dll导出和调用)

MFC动态链接库的创建和调用(类和函数的dll导出和调用)

1.新建MFC DLL工程,取名为:DLL0410
动态链接库的创建和调用(类,函数的DLL导出和调用)
2.在工程中编辑好DLL0410.h,DLL0410.cpp,DLL0410.def三个文件后编译生成对应的dll和lib文件
2.1 DLL0410.h
2.2 DLL0410.cpp
2.3 DLL0410.def
2.4 编辑好上面的3个文件编译后,用dumpbin命令查看是否有函数导出。

(如图所示,sub全局函数和add类的成员函数已经导出)
3.新建一个工程DLL0410test将生成的DLL0410.dll,DLL0410.lib以及DLL0410.h文件拷贝到 DLL0410test工程目录下
4.静态调用:在工程的DLL0410test.cpp文件中导入头文件DLL0410.h,并编写对应的静态调用代码。

同时也要在工程属性链接中加入DLL0410.lib文件。

(如果编译出错有可能是,工程属性中的常规>>字符集>>修改为 使用多字节字符集)
运行成功
5.4.动态调用:只需将生成的DLL0410.dll文件拷贝到新建工程目录下,直接在工程的
DLL0410test.cpp中编写动态调用代码即可。

不用做其他任何连接和导入头文件的操作。

运行成功。

动态链接库基本概念

动态链接库基本概念

动态链接库基本概念在 Windows中存在⼀种叫做DLL(Dynamic Linkable Library动态链接库)的⽂件。

它可以提供⼀些应⽤程序可以导⼊的数据、函数和类。

DLL⽂件平时驻留在磁盘中,只有当运⾏的应⽤程序确实要调⽤这些DLL模块的情况下,系统才会将它们装载到内存空间中。

这种⽅式不仅可以减少了应⽤程序EXE⽂件的⼤⼩和对内存空间的需求,耐⽽且这些DLL模块可以同时被多个应⽤程序所共享,从⽽极⼤⽅便了应⽤程序的设计。

以前曾经⽤库函数实现了代码共享。

这样存在⼀些缺点:⼀个缺点是增加了应⽤程序的代码量,它会占⽤更多的磁盘空间,同时在程序运⾏时也会占⽤较⼤的内存空间,从⽽造成了系统资源的浪费;另⼀个缺点是,在编写⼤的EXE程序时,每次重建时都必须⾼速编译所有源代码。

⽽DLL⽂件有以下为众所欢迎的特点:• 它是动态链接的,即平时它驻留在本地在计算机的硬盘中,只有当某应⽤程序确实要调⽤这些DLL模块的情况下,系统才会将它们从磁盘上装载到内存空间中,因此它不会使应⽤程序的代码量加⼤。

• 它是公⽤的,即当它⼀旦被调⼊内存则在内存中它只有⼀份⽂件,⽽该⽂件可以被Windows应⽤程序所调⽤。

• 当已经没有应⽤程序再需要调⽤它时,它会⾃动卸载以释放所占⽤的内存。

• 它们扩展了应⽤程序的特性。

• 它们可以⽤许多种编程语⾔来编写。

• 它们简化了软件项⽬的管理。

• 它们有助于资源的共享。

• 它们有助于应⽤程序的本地化• 它们有助于解决平台差异。

• 它们可以⽤于⼀些特殊的⽬的。

动态链接库的组成DLL必须有⼀个类似main函数的⼊⼝函数。

还应该包含外部应⽤程序可以调⽤的函数对象和资源等。

1动态链接库的⼊⼝函数。

MFC AppWizard编写DLL时,在⼀般的情况下它都会给程序员提供⼀个默认的DLL⼊⼝函数。

BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL moduleDWORD fdwReason, // reason for calling functionLPVOID lpvReserved // reserved);第⼀个参数:是指向DLL本⾝的句柄;第⼆个参数:常被⽤来指明DLL被调⽤的原因;第三个参数:是系统所保留的参数;⼊⼝函数的主要作⽤就是在系统调⽤该DLL时,进⾏⼀些初始化⼯作。

MFC下DLL编程(图解)

MFC下DLL编程(图解)

MFC 下DLL 编程(图解)DLL (Dynamic Link Library ,动态链接库)是微软公司为Windows 和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。

DLL 是应用程序的一种扩展,也是软件共享和重用的传统方法。

DLL 除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。

而且DLL 与编写它的语言无关,例如,用VC 生成的规则DLL ,可以被VB 、Delphi 等生成的应用程序使用。

DLL 可以用多种语言和工具编写,我们这里只介绍如何使用MFC 来编写和使用DLL 。

相关说明文档位于MSDN 帮助的“目录\开发工具和语言\Visual Studio\Visual C++\常见编程方法\DLL\”中。

8.1 基础本节先讨论DLL 与静态库的区别,然后列出几种适合放置DLL 的目录,最后介绍MFC DLL 的三种类型。

8.1.1 DLL 与静态链接库静态链接库Lib (Static Link Library ),是在编译的链接阶段将库函数嵌入到应用程序的内部。

如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。

这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。

Lib 的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL 。

而DLL 采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL 文件),而且只有在应用程序真正调用时,才加载到内存。

在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。

当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。

参见图8-1。

图8-1 静态库函数与动态链接库的区别DLL 的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL 。

例如,如果你的MFC 项目被设置成“在共享DLL 中使用MFC ”的,则虽然生成的可执行程序很使用静态库函数使用动态链接库小,但是在其他没有安装Visual C++(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。

如何编写dll文件

如何编写dll文件
生成一个Dll工程,然后将你的类和函数都添加进去,然后将要输出的函数在该工程下的Translate.def文件中将名字列出(注意,只要名字,不要括号、参数等);实际上和你的Exe工程没有很大的区别。
如果你要用VB用,在Dll中定义你的函数的时候前面要加上“__stdcall”关键字,否则VB没有办法使用。
——(1)Windows的系统目录:\windows\system;
——(2)DOS中path所指出的任何目录;
——(3)程序所在的目录;
一.动态链接库(DLL)结构
——DLL中定义有两种函数:导出函数(export function)和内部函数
(internal function),导出函数可以被其他模块调用,内部函数只能在DLL内部使用。我们在用C++定制DLL文件时,需要编写的就是包含导出函数表的模块 定义文件(.DEF)和实现导出函数功能的C++文件。下面以Sample.dll为例介绍DEF文件和实现文件的结构:
MFC扩展DLL一般用来提供派生于MFC的可重用的类,以扩展已有的MFC类库的功能。MFC扩展DLL使用MFC的动态链接版本。只有使用MFC动态 链接的可执行程序(无论是EXE还是DLL)才能访问MFC扩展DLL。MFC扩展DLL的另一个有用的功能是它可以在应用程序和它所加载的MFC扩展 DLL之间传递MFC和MFC派生对象的指针。在其它情况下,这样做是可能导致问题的。
非MFC DLL
静态链接到MFC的常规DLL
动态链接到MFC的常规DLL
MFC扩展DLL
其中非MFC DLL(non-MFC DLL)内部不使用MFC,调用非MFC DLL提供的导出函数的可执行程序可以使用MFC,也可以不使用MFC。一般来说,非MFC DLL的导出函数都使用标准的C接口(standard C interface)。

CC++中动态链接库的创建和调用

CC++中动态链接库的创建和调用
3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数
以下是引用片段: #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; }
LIBRARY MyDll
EXPORTS
Max@1
4、编译程序生成动态连接库。
4、编译程序生成动态连接库
二、用.def文件创建动态连接库DllDemo.dll。
1、删除DllDemo工பைடு நூலகம்中的DllDemo.h文件。
2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。
3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:
动态连接库的创建步骤:
一、创建Non-MFC DLL动态链接库
1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project
—>工程名:DllDemo
2、新建一个.h文件DllDemo.h
以下是引用片段: #ifdef DllDemo_EXPORTS #define DllAPI __declspec(dllexport) #else #define DllAPI __declspec(dllimport) extern "C" //原样编译 { DllAPI int __stdcall Max(int a,int b); //__stdcall使非C/C++语言内能够调用API } #endif

动态链接库

动态链接库

4.2 DLL的基本理论 应用程序在使用DLL中的内容之前,系统要调用入出口 函数完成DLL的初始化和终止工作。 4.2.1 DLL入出口函数 1、DllMain函数:在一个DLL的调用和撤除时被调用,一 般发生在应用程序使用LoadLibrary 和FreeLibrary等函数 及进程经线程启动和终止时。函数结构为:
4.2.4 从DLL中导出数据变量 (1)使用DEF文件,设置关键字CONSTANT导出.通过 用CONSTANT标志时,表明前面导出的不是函数,而 是一个数据变量. EXPORTS Bvariable @4 CONSTANT Extern BOOL bVariable ;//程序中的应用 (2)可以在应用程序中使用关键字 _declspec(dllimport) 引入对DLL导出的变量的作用,在DLL源程序中以 _declspec(dllexport)来说明要导出的变量.
4.2.2 DLL的链接方式 DLL中包含一个或多个函数,调用这些函数的过程和 编译,链接的过程是独立的.有两种链接方式:隐式 链接和显式链接.
1. 隐式链接DLL 原理:先说明DLL的导入库文件(lib),因在库文件中包 含了一系列指向动态链接库的指针.应用程序通过 库文件和DLL链接,调用DLL中的函数. 应用程序在调用DLL时需以下信息: A. 包含导出函数以及类声明的头文件,需要知道函数 名和函数接口信息. B. DLL的导入库文件,应用程序在编译链接需要. C. 实际的DLL文件,应用程序在运行时调用它.
4.3.2 用VC++的MFC生成的 DLL 1. MFC类库的DLL自动生成过程: FILE->NEW->PROJECT->MFC AppWizard(dll) > ok,然后选择相应的类型工程. 2. MFC AppWizard DLL类型: (1)静态链接MFC的 Regular DLL 在内部使用MFC的DLL库,可被MFC和非MFC的应用 程序使用,若在工程建立时使用的是MFC静态库, 导出函数使用标准C语言接口,创建时自动生成 DEF文件,如导出函数:MyExportFunction()用: extern “c” EXPORT MyExportFunction(); (2)动态链接MFC 的Regular DLL

(1)MFC调用DLL基本步骤

MFC调用DLL基本步骤
2013-5-9
第一步:创建动态链接库
1、创建动态链接库工程
2、选择一个可以到处某些符号的DLL工程
3、添加Add加法函数。

打开Math.cpp文件,在文件最后输入函数代码
打开Math.h文件,在文件中加入函数声明语句,以方便外部调用Add函数
4、按F7或者Build按钮,此时将产生Math.dll和Math.lib文件,在Debug文件夹内,Math.h文件在Debug文件外
第二步在工程中使用DLL
1、在2DCAD中添加调用DLL的对话框并进行设置ID号
2、添加对话框类CTestDllDlg,并添加成员变量
3、将动态链接库文件复制到2DCAD目录下,有三个Math.dll、Math.lib、Math.h
4、给等号按钮添加消息处理
打开CTestDllDlg的OnButtonEqual函数,调用函数实现求和。

修改函数代码如下:
在TestDllDlg.cpp中包含动态链接库Math.dll的头文件Math.h:#include “Math.h”
5、将Math.lib加入到工程链接库
6、在2DCAD程序中弹出CTestDllDlg对话框
为2DCAD添加一个顶层菜单DLL和一个菜单项使用[Math.dll],修改菜单项ID为ID_DLL_MATH,并添加消息处理函数
修改函数如下:
在MainFrm.cpp中包含对话框类头文件:#include “TestDllDlg.h”
6、编译并运行2DCAD程序即可。

MFC 教程 第13章动态链接库_


13.2 动态链接库的创建
设计DLL的主要工作是编写库中的函数,方法 与编写一般函数的方法基本相同。但要对库中的 函数进行必要的声明,说明哪些函数是可以导出的, 哪些不可以. 声明DLL导出函数有两种方法: 在.def文件中声明;

使用关键字_declspec(C常规型DLL
常规型DLL可用于MFC应用程序和非MFC应用程序。用 MFC AppWizard创建MFC DLL框架时,在New对话框中 的Projects选项卡中选择MFC AppWizard(dll)选项,在 出现的对话框中选择创建常规型DLL即可。 MFC把DLL的入口函数DLLMain封装在CWinApp中。 导出项目要使用关键字_declspec(dllexport)来说明。
14
13.2 动态链接库的创建
例如
; DLL名字为Sample LIBRARY Sample ; 函数ShowMe为导出函数 EXPORTS ShowMe ;def文件结束
15
13.2 动态链接库的创建



在创建DLL时,编译链接器先使用def文件创建两个文件: 一个导出文件(.EXP)和一个导入库文件(.LIB),然后 使用导出文件再创建DLL文件。 导入库文件中存放了外部应用程序可导入的DLL导出函数 名称的列表,函数的代码则存放在DLL文件中。 外部应用程序使用的文件是导入库文件和DLL文件。

17
;DLL的名称 LIBRARY MFCexp13_1dll ; 声明ShowHello为导出函数 EXPORTS ShowHello ;def文件结束
18
新建一个源文件MFCexp13_1dll.cpp,并在文件中添加如下代码:
#include <windows.h> BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }

(动态链接库)DLL编写与使用方法

DLL的创建与调用1、DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。

这些可以直接拿来使用。

静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式。

静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。

(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

2、创建一个DLL2.1 非MFC的DLL2.1.1声明导出函数:extern “C” __declspec(dllexport) int add(int a, int b);其中extern “C”为声明为C编译。

由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。

这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。

__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数从dll中声明输出函数有两种方式:(1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

动态链接库

应用程序与动态链接库之间的区别尽管DLL和应用程序都是可执行的程序模块,但他们之间还是有若干不同之处。

对于最终用户来说,最明显的差异在于DLL不是可直接执行的程序。

从系统角度来说,应用程序和DLL 之间有两个基本差异:? 应用程序可以有多个同时在系统上运行的实例,而DLL只能有一个实例。

? 应用程序可以拥有堆栈、共用内存、文件句柄、消息队列等,而DLL没有。

DLL的优点DLL(dynamic-link library)是由函数和数据组成的模块,可以应用与其他模块(应用程序或者DLL)中。

DLL动态链接库可以定义两种函数:内部函数和导出函数。

正如它所定义的一样,导出函数可以由其他模块调用。

内部函数只能由动态链接库自己来调用。

虽然,DLL也可以导出数据,但这些数据通常还是给动态链接库内部的函数使用的。

当然,其他模块还是可以给通过这些数据地址来读写这些数据。

DLL类型非MFCDLL非MFCDLL是内部不使用MFC的DLL,这类DLL中的导出函数可由MFC或非MFC可执行文件调用。

函数通常是通过标准C接口从非MFCDLL导出的。

静态链接到MFC的规则DLL静态链接到MFC的规则DLL是在内部使用MFC的DLL,这类DLL中的导出函数可由MFC或非MFC可执行文件调用。

正如名称所述,这类DLL是使用MFC静态链接库版本生成的。

函数通常通过标准C接口从规则DLL中导出。

静态链接库到MFC的规则DLL具有如下功能:? 客户端执行文件可以用任何支持使用DLL的语言(C、C++、Pascal、VisualBasic等)编写;它不必是MFC应用程序。

? DLL可以链接到由应用程序使用的同一MFC静态链接库。

已不再有单独用于DLL的静态链接库版本。

? 在 MFC 4.0 版之前,USRDLL 与静态链接到 MFC 的规则 DLL 提供相同的功能类型。

自Visual C++ 4.0 版起,“USRDLL”一词已过时。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
13.2 动态 Nhomakorabea接库的创建
设计DLL的主要工作是编写库中的函数,方法 与编写一般函数的方法基本相同。但要对库中的 函数进行必要的声明,说明哪些函数是可以导出的, 哪些不可以. 声明DLL导出函数有两种方法: 在.def文件中声明;

使用关键字_declspec(dllexport)来声明。
13
26

注意:一个扩展DLL只能与MFC采用动态 联编方式链接并且只能被MFC应用程序 使用.
例13-4 创建一个MFC扩展DLL,它可以输出一 个自定义的对话框.
27

13.3 动态链接库的使用


应用程序使用DLL的导出函数有两种方式: 隐式链接; 显式链接。 隐式链接方式
需要使用DLL的应用程序把该DLL的导入文件加到应用 程序的项目中。应用程序运行时,Windows会根据导 入文件提供的信息加载DLL,应用程序通过函数名实现 对DLL函数的动态链接。由于在程序中没有出现加载 DLL的代码,所以把这种链接方式叫做隐式链接。
8
13.1 动态链接库的基本概念

动态链接库的入口函数
BOOL APIENTRY DllMain( HANDLE hModule, //指向Dll本身的句柄 DWORD ul_reason_for_call, //Dll被调用的原因 LPVOID lpReserved ) //系统所保留的参数 { //可以在这里编写DLL的初始化代码 return TRUE; }
获得DLL库 获得DLL 函数 释放DLL库
30

1)获得DLL库
通过调用Win32的LoadLibrary函数,并以要使用的 DLL文件所在的路径为参数,可以取得DLL. HINSTANCE LoadLibrary( LPCTSTR lpLibFileName); 函数返回值为DLL库的句柄.
31
9
DllMain函数在DLL被加载和卸载时被调用, 在单个线程启动和终止时,DLLMain函数也被 调用,ul_reason_for_call指明了被调用的原因。 原因共有4种,即PROCESS_ATTACH、 PROCESS_DETACH、THREAD_ATTACH和 THREAD_DETACH,以switch语句列出。
int ShowHello(void) //需要导出的函数 { MessageBox(NULL,"Hello World!","",MB_YESNO); return TRUE; }
19
13.2 动态链接库的创建

使用关键字_declspec(dllexport)声明导出函数
例 如 , 声 明 函 数 ShowMsg 为 导 出 函 数 。 _declspec(dllexport) int ShowMsg(int s);
25
13.2 动态链接库的创建


MFC扩展型DLL
扩展型DLL可以导出MFC的继承类。 在 扩 展 型 DLL 中 , 在 类 的 名 称 前 面 加 宏 AFX_EXT_CLASS,就可以把一个MFC继承类声明为导 出类。 例如: calss AFX_EXT_CLASS CMyDllClass:public CObject { …… };
11
13.1 动态链接库的基本概念


导出函数和内部函数
DLL中定义的供外部应用程序调用的函数,叫做导出函数 (export function); 只 为 在 DLL 内 部 调 用 的 函 数 叫 做 内 部 函 数 (internal function); 导出函数在客户端叫做导入函数。


12


MFC常规型DLL
常规型DLL可用于MFC应用程序和非MFC应用程序。用 MFC AppWizard创建MFC DLL框架时,在New对话框中 的Projects选项卡中选择MFC AppWizard(dll)选项,在 出现的对话框中选择创建常规型DLL即可。 MFC把DLL的入口函数DLLMain封装在CWinApp中。 导出项目要使用关键字_declspec(dllexport)来说明。
16
例13-1
创建一个Dll,在应用程序中调用它提供的 ShowHello函数时,将弹出一个消息框,该 消息框的信息为”Hello, World!” 1)使用MFC AppWizard创建一个空的Win32 Dynamic-Link Library工程,工程名为 MFCexp13_1dll. 2)在工程中新建一个文本文件,名为 MFCexp13_1dll.def,输入以下代码:
6
13.1 动态链接库的基本概念
Windows 使用DLL实现程序模块共享。 其特点是: 动态链接的; 公用的; 自动卸载。 DLL由全局数据、可导出函数、类和资源组成。 主要任务:为使用它的各应用程序提供可调用的导 出函数

7
根据编写规范,Windows必须查找并 执行DLL里的DllMain函数作为加载DLL的 依据,它使得DLL得以保留在内存里。这 个函数并不属于导出函数,而是DLL的内 部函数。这意味着不能直接在应用工程 中引用DllMain函数,DllMain是自动被调 用的。
获得DLL 函数 获得DLL的句柄后,调用GetProcAddress来获得 该DLL中与导入函数相匹配的导出函数. FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName ); 返回值为DLL导出函数的地址.

32

释放DLL库 使用完DLL后,必须用FreeLibrary函数释放动态 连接库. BOOL FreeLibrary( HMODULE hLibModule //DLL句柄
28
Windows搜索DLL的顺序为: 1)包含应用程序EXE文件的目录 2)进程的当前工作目录 3)Windows系统目录 4)Windows目录 5)列在Path环境变量中的一系列目录

29
13.3 动态链接库的使用

显式链接方式
在应用程序中使用Windows API函数直接完 成DLL加载及函数调用,称为DLL的显式链接 方式。具体步骤如下:
14
13.2 动态链接库的创建
例如
; DLL名字为Sample LIBRARY Sample ; 函数ShowMe为导出函数 EXPORTS ShowMe ;def文件结束
15
13.2 动态链接库的创建



在创建DLL时,编译链接器先使用def文件创建两个文件: 一个导出文件(.EXP)和一个导入库文件(.LIB),然后 使用导出文件再创建DLL文件。 导入库文件中存放了外部应用程序可导入的DLL导出函数 名称的列表,函数的代码则存放在DLL文件中。 外部应用程序使用的文件是导入库文件和DLL文件。
4
(2)动态链接库随处可见 我们在Windows目录下的system32 文件夹中会看到kernel32.dll、user32.dll 和gdi32.dll,windows的大多数API都包 含在这些DLL中。kernel32.dll中的函数主 要处理内存管理和进程调度;user32.dll 中的函数主要控制用户界面;gdi32.dll中 的函数则负责图形方面的操作
3
对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种 语言编写的DLL都可以相互调用。譬如Windows提供的 系统DLL(其中包括了Windows的API),在任何开发 环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
22

例13-3

创建一个常规型DLL,它可以提供一个导 出函数ShowMsg,当应用程序调用它时,将 会显示一个消息框,该消息框上显示字符 串”MFC”
23
1.创建一个常规DLL,在头文件中添加如下代码: _declspec(dllexport)int ShowMsg();
2.在源文件中添加如下代码: _declspec(dllexport) int ShowMsg(void) { char*msg="MFC"; ::MessageBox(NULL,msg,"",MB_OK); return 1; }
//导出C格式的函数(用C++编写的DLL函数) extern“C” _declspec(dllexport) int ShowMsg(int s);
20
例13-2 重写13-1,用 _declspec(dllexport)来声明导出函数
21
13.2 动态链接库的创建

用MFC编写DLL
在VC++中还可以使用MFC来编写DLL。MFC支持两种 形式的DLL:常规型DLL和扩展型DLL。

17
;DLL的名称 LIBRARY MFCexp13_1dll ; 声明ShowHello为导出函数 EXPORTS ShowHello ;def文件结束
18
新建一个源文件MFCexp13_1dll.cpp,并在文件中添加如下代码:
#include <windows.h> BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
10
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: … case DLL_THREAD_ATTACH: … case DLL_THREAD_DETACH: … case DLL_PROCESS_DETACH: … } return TRUE; }
相关文档
最新文档