Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
1
电子工程系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
2
Windows应用程序设计
Win32 API
Windows应用程序设计模式
Windows应用程序的基本结构
结构化异常处理
动态链接库
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
3
Win32 API
Windows 应用程序总是在常规的用户态下运行
操作系统核心组件则对外界表现出中立的性质,它们不实现用户界面,甚至不提供编程接口,系统服务调用对应用程序而言是不公开的
Windows操作系统依靠一组用户态环境子系统,作为应用程序与操作系统核心之间的接口
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
4
Win32子系统是 Windows 2000/XP操作系统的固有的子系统,这个子系统能够提供应用程序运行所需要的窗口管理、图形设备接口、媒体控制、内存管理等各项服务功能,这些功能以函数库的形式组织在一起,
这就是 Win32应用程序编程接口,简称为 Win32 API
Win32子系统负责将 API调用转换成 Windows操作系统的系统服务调用
对于应用程序开发人员而言,他所看到的 Windows操作系统实际上就是 Win32 API,操作系统的其他部分对他来说是完全透明的。
Win32 API
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
5
Win32 API
W i n d o w s
ó| ó? 3ì Dò
W i n d o w s
ó| ó? 3ì Dò
W i n 3 2
×ó?μ í3
ó§ì?
μ í3 ·t
ó2?t 2?
o? D? ì?
Windows 应用程序与操作系统的关系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
6
Win32 API
USER32.DLL:负责处理用户接口
GDI32.DLL:负责在图形设备上执行绘图操作
KERNEL32.DLL:操作系统核心功能服务
COMCTL32.DLL:通用控件库
COMDLG32.DLL:公共对话框
SHELL32.DLL:用户界面外壳
DIBENG.DLL:图形引擎
NETAPI32.DLL:网络
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
7
Win32 API
标准 Win32 API函数分类:
系统服务
通用控件库
图形设备接口
网络服务
用户接口
系统 Shell
Windows 系统信息
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
8
Windows应用程序设计模式
窗口目的是保证用户能够同时访问大多数应用程序应用程序使用窗口来显示输出或接收用户的输入应用程序只有通过窗口才能访问系统显示器;并且通过使用窗口与其他应用程序共享系统显示器
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
9
Windows应用程序设计模式
事件驱动
Windows 应用程序的执行顺序取决于事件发生的顺序,描述事件发生的信息称为消息,而事件驱动程序设计则是围绕着消息的产生与处理而展开的。
消息可以分为由硬件设备产生的输入消息和来自
Windows系统的窗口管理消息发送消息 —— send
指派消息 —— post
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
10
Windows应用程序设计模式
事件驱动硬件输入 系统消息队列应用程序队列 1
应用程序队列 n
W indows
W inMa in 函数消息循环窗口函数 1
窗口函数 m
应用程序 1
W inMa in 函数消息循环窗口函数 1
窗口函数 m
应用程序 n
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
11
Windows应用程序设计模式
Windows应用程序的开发流程
Windows 应用程序分为程序代码和用户界面资源两部分,两部分通过资源编译器组合为一个完整的 EXE文件将用户界面资源一类的静态数据与程序代码相分离有如下一些优点:
减少内存要求;
划清了程序员与用户界面设计人员的任务分工;
用户界面风格的变化可以不必修改程序代码或只需进行少量的修改 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
12
Windows应用程序设计模式
Windows应用程序的开发流程
.EXE链接器.LIB
.DEF
.RC.H.C
.DLG,BMP,CUR.ICO,FON
.RES
.OBJ
资源编译器
C编译器字体编辑器图象编辑器对话框编辑器工具文本文件二进制文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
13
Windows应用程序 的基本结构
Windows应用程序具有相对固定的基本结构,
入口点函数 WinMain和窗口函数构成了
Windows应用程序的基本框架。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
14
Windows应用程序 的基本结构
WinMain函数
WinMain函数是程序的入口点,相当于标准 C语言中的 main函数
WinMain函数主要由四部分组成:
注册窗口类
创建窗口
显示窗口
建立消息循环
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
15
Windows应用程序 的基本结构
WinMain函数 消息循环
Windows并不直接把输入消息发送给应用程序,
而是将其送入应用程序的消息队列之中。此外,
Windows和其他应用程序也可以将消息指派到应用程序队列中。
应用程序必须读取应用程序队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,负责这一任务的便是消息循环。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
16
Windows应用程序 的基本结构
WinMain函数 消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
GetMessage函数检索到 WM_QUIT消息时返回非零值,检索到其他消息均返回 NULL。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
17
Windows应用程序 的基本结构
窗口函数窗口函数也称为窗口过程,负责从 Windows接收消息,并根据这些消息完成特定的操作窗口函数是一个回调函数,由 Windows系统调用,
应用程序并不会直接调用它的窗口函数窗口函数的主体是由一系列 case语句组成的消息处理程序段如果窗口函数不处理某些消息,则必须把它们传给 DefWindowProc函数
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
18
ca s e 1
ca s e 2
ca s e 3
…
Def aul t
Win d ow s系统应用程序
W i nM a i n ( )
消息循环
W ndPr oc ( )
④
Di s p atch M ess age ( )
⑥
⑤
Def Wi n d o wP roc ( )
检索到的消息
③
GetM ess age ( )
②
指派的消息
W M_ K E Y D O W N
W M_ K E Y U P
W M_ MO U S E MO V E
W M_ L B U T T O N D O W N
W M_ Q U I T
…,..
发送的消息
W M_ C R E A T E
W M_ D E S T R O Y
W M_ S I Z E
W M_ P A I N T
…,..
①
应用程序的消息队列回调
Windows应用程序 的基本结构
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
19
Windows应用程序 的基本结构当用户关闭窗口时,Windows系统将把
WM_DESTROY消息发送给该窗口的窗口函数,
在这种情况下,窗口函数应该使用
PostQuitMessage函数将 WM_QUIT消息发送到应用程序队列中,这样可以使 GetMessage函数检索到 WM_QUIT消息,从而结束消息循环,
退出应用程序。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
20
c a se 1
c a se 2
...
c a se W M _DE S TROY
De f a ul t
Win d ow s 系统应用程序
Wi nMa i n ( )
消息循环
WndP r oc ( )
②
P os tQui tM e ss a ge ( 0)
W M _QU I T 消息
⑤
Ge tM e ss a ge ( )
④
W M_QUI T 消息应用程序的消息队列
W M_DES TR OY 消息
①
③
退出消息循环结束应用程序
⑥
Windows应用程序 的基本结构
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
21
结构化异常处理
Windows在系统底层提供了一种称为结构化异常处理
SEH的系统机制。利用 SEH可以把程序主要的工作同错误处理分离开来,这样的分离,可以使程序员集中精力 关注程序要完成的任务,而将可能发生的错误放在后面处理。
异常是在应用程序的正常执行过程中发生的不正常事件。 CPU引发的异常称为 硬件异常,操作系统和应用程序直接引发的异常,称为 软件异常
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
22
结构化异常处理
SHE是操作系统的一种系统机制,与特定的程序设计语言无关。
应用程序要利用系统提供的 SHE机制,则必须借助于特定程序设计语言的相关语法。
因此,SEH不但涉及操作系统,而且与编译器有密切的关系。
结构化异常处理包括异常处理和终止处理两个方面
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
23
结构化异常处理
异常处理
__try
{
..,//guarded section
}
__except(exception filter)
{
..,//exception handler
}
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
24
结构化异常处理
异常处理异常过滤器返回如下三个异常标识符之一
ECXEPTION_EXECUTE_HANDLER
ECXEPTION_CONTINUE_EXECUTION
ECXEPTION_CONTINUE_SEARCH
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
25
结构化异常处理
终止处理
Windows应用程序在运行时通常要分配资源,使用这些资源,然后释放它们。
由于异常改变了控制的流程,因此很容易导致无法释放在产生异常的代码块中分配的资源。
使用终止处理程序可以保证进行这样的清除工作
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
26
结构化异常处理
终止处理
__try
{
...
}
__finally
{
..,
}
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
27
结构化异常处理
终止处理有两种情况可能使受保护段不正常地结束:
在 try块中执行了 return,goto,break或
continue等控制语句
在 try块中发生异常
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
28
结构化异常处理
软件异常当一个函数执行失败时,习惯上要返回一些特殊的值来,函数的调用者可以检查这些特殊值并采取一种替代的动作如果这个调用者是被另一个调用者调用的函数
,那么它还需要将它自己的失败代码返回给它的调用者这种错误代码的逐层传递会使源程序变得非常难于编写和维护采用软件异常则可以解决这些问题
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
29
动态链接库动态链接库 DLL是一个可执行程序模块,模块中包含了可以被其他应用程序或其他 DLL共享的程序代码和资源采用 DLL的优点:
当多个进程同时使用同一个 DLL时,只要在内存中装入它的一个副本即可,从而可以节省内存;
DLL与调用它的应用程序相分离,因此可以在不修改应用程序的情况下对 DLL进行更新;
只要在调用 DLL中的函数时遵循相同的调用规范,那么 DLL中的函数就可以被各种编程语言编制的应用程序调用
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
30
动态链接库
DLL到进程地址空间的映射装入时刻动态链接经过编译的,obj 文件 引入库,包含 DLL 函数的重定位信息链接器可执行程序重定位信息动态链接库调用 DLL 中的函数内存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
31
动态链接库
DLL到进程地址空间的映射运行时刻动态链接在运行时刻,通过调用 LoadLibrary可以使 DLL
加载到一个进程的地址空间中为了在运行时刻从 DLL中调用一个函数,可以通过调用 GetProcAddress获取函数的地址
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
32
动态链接库
DLL到进程地址空间的映射虚拟地址空间
0
2 GB
0
2 GB
进程 1
进程 2
D LL 数据
(共享)
D LL 数据
(私用进程 1 )
D LL 数据
(私用进程 1 )
D LL 代码物理内存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
33
动态链接库
DLL的入口点函数
DLL没有 WinMain函数,不含有消息循环,一般也不获取自己的消息,但是它有自己特殊的入口点函数,入口点函数的缺省名为 DllMain
当进程和线程被初始化或终止时,DllMain函数被
Windows系统调用。
DllMain要做的主要任务是执行进程级或线程级的初始化和清理工作。
如果不要求 DLL初始化,DllMain可以只是一个虚设函数。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
34
动态链接库
DLL的创建和使用创建 DLL文件需要用到源文件(,C)和头文件
(,H)。 DLL源文件通常包括入口点函数和供应用程序调用的 DLL库函数。头文件中含有
DLL要导出的所有函数与变量的说明在应用程序中调用 DLL中的函数或访问 DLL中的变量时,须告诉编译器要调用的函数或要访问的变量是在 DLL中:
__declspec(dllimport)
int Sub(int nPara1,int Para2);
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
35
电子工程系马洪兵
hoganma@263.net
cr
os
of
t?
W
indow
s
2
00
0/X
P
1
电子工程系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
2
Windows应用程序设计
Win32 API
Windows应用程序设计模式
Windows应用程序的基本结构
结构化异常处理
动态链接库
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
3
Win32 API
Windows 应用程序总是在常规的用户态下运行
操作系统核心组件则对外界表现出中立的性质,它们不实现用户界面,甚至不提供编程接口,系统服务调用对应用程序而言是不公开的
Windows操作系统依靠一组用户态环境子系统,作为应用程序与操作系统核心之间的接口
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
4
Win32子系统是 Windows 2000/XP操作系统的固有的子系统,这个子系统能够提供应用程序运行所需要的窗口管理、图形设备接口、媒体控制、内存管理等各项服务功能,这些功能以函数库的形式组织在一起,
这就是 Win32应用程序编程接口,简称为 Win32 API
Win32子系统负责将 API调用转换成 Windows操作系统的系统服务调用
对于应用程序开发人员而言,他所看到的 Windows操作系统实际上就是 Win32 API,操作系统的其他部分对他来说是完全透明的。
Win32 API
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
5
Win32 API
W i n d o w s
ó| ó? 3ì Dò
W i n d o w s
ó| ó? 3ì Dò
W i n 3 2
×ó?μ í3
ó§ì?
μ í3 ·t
ó2?t 2?
o? D? ì?
Windows 应用程序与操作系统的关系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
6
Win32 API
USER32.DLL:负责处理用户接口
GDI32.DLL:负责在图形设备上执行绘图操作
KERNEL32.DLL:操作系统核心功能服务
COMCTL32.DLL:通用控件库
COMDLG32.DLL:公共对话框
SHELL32.DLL:用户界面外壳
DIBENG.DLL:图形引擎
NETAPI32.DLL:网络
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
7
Win32 API
标准 Win32 API函数分类:
系统服务
通用控件库
图形设备接口
网络服务
用户接口
系统 Shell
Windows 系统信息
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
8
Windows应用程序设计模式
窗口目的是保证用户能够同时访问大多数应用程序应用程序使用窗口来显示输出或接收用户的输入应用程序只有通过窗口才能访问系统显示器;并且通过使用窗口与其他应用程序共享系统显示器
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
9
Windows应用程序设计模式
事件驱动
Windows 应用程序的执行顺序取决于事件发生的顺序,描述事件发生的信息称为消息,而事件驱动程序设计则是围绕着消息的产生与处理而展开的。
消息可以分为由硬件设备产生的输入消息和来自
Windows系统的窗口管理消息发送消息 —— send
指派消息 —— post
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
10
Windows应用程序设计模式
事件驱动硬件输入 系统消息队列应用程序队列 1
应用程序队列 n
W indows
W inMa in 函数消息循环窗口函数 1
窗口函数 m
应用程序 1
W inMa in 函数消息循环窗口函数 1
窗口函数 m
应用程序 n
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
11
Windows应用程序设计模式
Windows应用程序的开发流程
Windows 应用程序分为程序代码和用户界面资源两部分,两部分通过资源编译器组合为一个完整的 EXE文件将用户界面资源一类的静态数据与程序代码相分离有如下一些优点:
减少内存要求;
划清了程序员与用户界面设计人员的任务分工;
用户界面风格的变化可以不必修改程序代码或只需进行少量的修改 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
12
Windows应用程序设计模式
Windows应用程序的开发流程
.EXE链接器.LIB
.DEF
.RC.H.C
.DLG,BMP,CUR.ICO,FON
.RES
.OBJ
资源编译器
C编译器字体编辑器图象编辑器对话框编辑器工具文本文件二进制文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
13
Windows应用程序 的基本结构
Windows应用程序具有相对固定的基本结构,
入口点函数 WinMain和窗口函数构成了
Windows应用程序的基本框架。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
14
Windows应用程序 的基本结构
WinMain函数
WinMain函数是程序的入口点,相当于标准 C语言中的 main函数
WinMain函数主要由四部分组成:
注册窗口类
创建窗口
显示窗口
建立消息循环
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
15
Windows应用程序 的基本结构
WinMain函数 消息循环
Windows并不直接把输入消息发送给应用程序,
而是将其送入应用程序的消息队列之中。此外,
Windows和其他应用程序也可以将消息指派到应用程序队列中。
应用程序必须读取应用程序队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,负责这一任务的便是消息循环。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
16
Windows应用程序 的基本结构
WinMain函数 消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
GetMessage函数检索到 WM_QUIT消息时返回非零值,检索到其他消息均返回 NULL。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
17
Windows应用程序 的基本结构
窗口函数窗口函数也称为窗口过程,负责从 Windows接收消息,并根据这些消息完成特定的操作窗口函数是一个回调函数,由 Windows系统调用,
应用程序并不会直接调用它的窗口函数窗口函数的主体是由一系列 case语句组成的消息处理程序段如果窗口函数不处理某些消息,则必须把它们传给 DefWindowProc函数
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
18
ca s e 1
ca s e 2
ca s e 3
…
Def aul t
Win d ow s系统应用程序
W i nM a i n ( )
消息循环
W ndPr oc ( )
④
Di s p atch M ess age ( )
⑥
⑤
Def Wi n d o wP roc ( )
检索到的消息
③
GetM ess age ( )
②
指派的消息
W M_ K E Y D O W N
W M_ K E Y U P
W M_ MO U S E MO V E
W M_ L B U T T O N D O W N
W M_ Q U I T
…,..
发送的消息
W M_ C R E A T E
W M_ D E S T R O Y
W M_ S I Z E
W M_ P A I N T
…,..
①
应用程序的消息队列回调
Windows应用程序 的基本结构
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
19
Windows应用程序 的基本结构当用户关闭窗口时,Windows系统将把
WM_DESTROY消息发送给该窗口的窗口函数,
在这种情况下,窗口函数应该使用
PostQuitMessage函数将 WM_QUIT消息发送到应用程序队列中,这样可以使 GetMessage函数检索到 WM_QUIT消息,从而结束消息循环,
退出应用程序。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
20
c a se 1
c a se 2
...
c a se W M _DE S TROY
De f a ul t
Win d ow s 系统应用程序
Wi nMa i n ( )
消息循环
WndP r oc ( )
②
P os tQui tM e ss a ge ( 0)
W M _QU I T 消息
⑤
Ge tM e ss a ge ( )
④
W M_QUI T 消息应用程序的消息队列
W M_DES TR OY 消息
①
③
退出消息循环结束应用程序
⑥
Windows应用程序 的基本结构
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
21
结构化异常处理
Windows在系统底层提供了一种称为结构化异常处理
SEH的系统机制。利用 SEH可以把程序主要的工作同错误处理分离开来,这样的分离,可以使程序员集中精力 关注程序要完成的任务,而将可能发生的错误放在后面处理。
异常是在应用程序的正常执行过程中发生的不正常事件。 CPU引发的异常称为 硬件异常,操作系统和应用程序直接引发的异常,称为 软件异常
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
22
结构化异常处理
SHE是操作系统的一种系统机制,与特定的程序设计语言无关。
应用程序要利用系统提供的 SHE机制,则必须借助于特定程序设计语言的相关语法。
因此,SEH不但涉及操作系统,而且与编译器有密切的关系。
结构化异常处理包括异常处理和终止处理两个方面
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
23
结构化异常处理
异常处理
__try
{
..,//guarded section
}
__except(exception filter)
{
..,//exception handler
}
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
24
结构化异常处理
异常处理异常过滤器返回如下三个异常标识符之一
ECXEPTION_EXECUTE_HANDLER
ECXEPTION_CONTINUE_EXECUTION
ECXEPTION_CONTINUE_SEARCH
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
25
结构化异常处理
终止处理
Windows应用程序在运行时通常要分配资源,使用这些资源,然后释放它们。
由于异常改变了控制的流程,因此很容易导致无法释放在产生异常的代码块中分配的资源。
使用终止处理程序可以保证进行这样的清除工作
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
26
结构化异常处理
终止处理
__try
{
...
}
__finally
{
..,
}
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
27
结构化异常处理
终止处理有两种情况可能使受保护段不正常地结束:
在 try块中执行了 return,goto,break或
continue等控制语句
在 try块中发生异常
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
28
结构化异常处理
软件异常当一个函数执行失败时,习惯上要返回一些特殊的值来,函数的调用者可以检查这些特殊值并采取一种替代的动作如果这个调用者是被另一个调用者调用的函数
,那么它还需要将它自己的失败代码返回给它的调用者这种错误代码的逐层传递会使源程序变得非常难于编写和维护采用软件异常则可以解决这些问题
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
29
动态链接库动态链接库 DLL是一个可执行程序模块,模块中包含了可以被其他应用程序或其他 DLL共享的程序代码和资源采用 DLL的优点:
当多个进程同时使用同一个 DLL时,只要在内存中装入它的一个副本即可,从而可以节省内存;
DLL与调用它的应用程序相分离,因此可以在不修改应用程序的情况下对 DLL进行更新;
只要在调用 DLL中的函数时遵循相同的调用规范,那么 DLL中的函数就可以被各种编程语言编制的应用程序调用
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
30
动态链接库
DLL到进程地址空间的映射装入时刻动态链接经过编译的,obj 文件 引入库,包含 DLL 函数的重定位信息链接器可执行程序重定位信息动态链接库调用 DLL 中的函数内存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
31
动态链接库
DLL到进程地址空间的映射运行时刻动态链接在运行时刻,通过调用 LoadLibrary可以使 DLL
加载到一个进程的地址空间中为了在运行时刻从 DLL中调用一个函数,可以通过调用 GetProcAddress获取函数的地址
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
32
动态链接库
DLL到进程地址空间的映射虚拟地址空间
0
2 GB
0
2 GB
进程 1
进程 2
D LL 数据
(共享)
D LL 数据
(私用进程 1 )
D LL 数据
(私用进程 1 )
D LL 代码物理内存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
33
动态链接库
DLL的入口点函数
DLL没有 WinMain函数,不含有消息循环,一般也不获取自己的消息,但是它有自己特殊的入口点函数,入口点函数的缺省名为 DllMain
当进程和线程被初始化或终止时,DllMain函数被
Windows系统调用。
DllMain要做的主要任务是执行进程级或线程级的初始化和清理工作。
如果不要求 DLL初始化,DllMain可以只是一个虚设函数。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
34
动态链接库
DLL的创建和使用创建 DLL文件需要用到源文件(,C)和头文件
(,H)。 DLL源文件通常包括入口点函数和供应用程序调用的 DLL库函数。头文件中含有
DLL要导出的所有函数与变量的说明在应用程序中调用 DLL中的函数或访问 DLL中的变量时,须告诉编译器要调用的函数或要访问的变量是在 DLL中:
__declspec(dllimport)
int Sub(int nPara1,int Para2);
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
35
电子工程系马洪兵
hoganma@263.net