版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows编程基础,主要内容,应用程序编程接口-API,Windows程序架构,动态链接库,一、Windows程序架构,Windows应用程序总是在常规的用户态下运行。,Windows应用程序依靠操作系统提供的用户态环境子系统,访问操作系统提供的核心服务。,1、概述,Windows程序的工作环境?用户态?内核态?,一、Windows程序架构,2、基于窗口的设计思路,目的是保证用户能够同时访问大多数应用程序。,应用程序使用窗口来显示输出或接收用户的输入。,利用窗口机制支持革命性的应用。,一、Windows程序架构,3、事件驱动方式,Windows应用程序的执行顺序取决于事件发生的顺序,描述事
2、件发生的信息称为消息,而事件驱动程序设计则是围绕着消息的产生与处理而展开的。,消息可以分为由硬件设备产生的输入消息和来自Windows系统的窗口管理消息。,发送消息send 指派消息post,一、Windows程序架构,Windows中的消息机制,一、Windows程序架构,4、开发流程,Windows应用程序分为程序代码和用户界面资源两部分,两部分通过资源编译器组合为一个完整的EXE文件。,将用户界面资源等静态数据与程序代码相分离有如下一些优点: 减少内存要求; 划清了程序员与用户界面设计人员的任务分工; 用户界面风格的变化可以不必修改程序代码或只需进行少量的修改。,一、Windows程序架
3、构,Windows应用程序开发流程,一、Windows程序架构,5、基本架构,Windows应用程序的基本流程,关键特性:,消息驱动机制 图形设备接口(GDI) 基于资源的程序设计 动态链接库,一、Windows程序架构,消息驱动机制 Windows程序和控制台应用程序之间一个最根本区别,在于控制台应用程序是通过调用系统函数来获得用户输入,而Windows程序则是通过系统发送的消息来处理用户输入。 Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。,图形设备接口(GDI) Windows则提供了一个抽象的接口,称为
4、图形设备接口,使得用户直接利用系统的GDI函数就能方便实现图形和文本的输出。,一、Windows程序架构,动态链接库 在Windows操作系统中,最主要的DLL有KERNEL32.DLL、GDI32.DLL和USER32.DLL。利用上述DLL实现任务、资源管理,提供图形设备接口,负责窗口管理等功能。,基于资源的程序设计 Windows应用程序包含众多图形元素,如光标、菜单、工具栏、位图、对话框等。,一、Windows程序架构,WinMain函数是程序的入口点,相当于标准C语言中的main函数。,WinMain函数主要由四部分组成: 注册窗口类; 创建窗口; 显示窗口; 建立消息循环。,6、W
5、inMain函数分析,一、Windows程序架构,WinMain函数的消息循环:,Windows并不直接把输入消息发送给应用程序,而是将其送入应用程序的消息队列之中。此外,Windows和其他应用程序也可以将消息指派到应用程序队列中。,应用程序必须读取应用程序队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,负责这一任务的便是消息循环。,一、Windows程序架构,while(GetMessage( ,GetMessage函数检索到WM_QUIT消息时返回零值,检索到其他消息均返回非零值。,消息循环:,TranslateMessage函数负责将消息的虚拟键转换成字符信息, Dis
6、patchMessage函数负责将消息队列中的消息发送相应的窗口函数进一步处理。,一、Windows程序架构,7、窗口函数,窗口函数也称为窗口过程,负责从Windows接收消息,并根据这些消息完成特定的操作。,窗口函数是一个回调函数,由Windows系统调用,应用程序并不会直接调用它的窗口函数。,窗口函数的主体是由一系列switch/case语句组成的消息处理程序段。,一、Windows程序架构,如果窗口函数不处理某些消息,则必须把它们传给DefWindowProc函数。,一、Windows程序架构,当用户关闭窗口时,Windows系统将把WM_DESTROY消息发送给该窗口的窗口函数,在这种
7、情况下,窗口函数应该使用PostQuitMessage函数将WM_QUIT消息发送到应用程序队列中,这样可以使GetMessage函数检索到WM_QUIT消息,从而结束消息循环,退出应用程序。,一、Windows程序架构,显示窗口:把窗口显示在屏幕上,应调用函数ShowWindow(),其中,参数hWnd指定要显示的窗口句柄,用来确定显示哪一个窗口。,更新窗口:调用UpdateWindow()函数迫使窗口立即重画客户区域,并发出WM_PAINT消息,如果更新区域是空的,就不发送任何消息。窗口的客户区域是指窗口菜单栏下面的矩形区域,除了客户区域之外,窗口所覆盖的其它区域,包括标题栏、菜单、滚动条
8、、边框等都是属于非客户区域。,一、Windows程序架构,8、消息处理,调用UpdateWindow()函数后,应用程序主窗口就显示在屏幕上,即程序的输入输出界面已经准备好,剩下来要完成的任务是处理消息。Windows应用程序接收以各种形式输入的消息,包括键盘、鼠标、计时器等产生的消息,也可以是其它应用程序发来的消息。Windows监控所有的输入设备,将外部发生的事件转化为对应的消息,并将信息放入消息队列中。最后,应用程序从自己的消息队列中按一定的次序检索消息并将每一个消息发送到相应的窗口函数中进行处理。,利用函数发送消息:,使用PostMessage()投递消息 在线程消息队列中的队尾放置消
9、息并立返回 不等待线程处理这条消息。 使用SendMessage()立即发送消息 直接向一窗口函数发送消息,它调用一个窗口函数 等待窗口函数对消息的处理和返回结果。 使用SendDlgItemMessage()向对话框中控件发送消息 要指定控件的标识和含有该控件的对话框窗口句柄。,一、Windows程序架构,一、Windows程序架构,常见的消息处理:,常见的消息如WM_COMMAND消息、WM_PAINT消息和WM_DESTROY消息。当用户选择一个菜单的选项时,发送WM_COMMAND消息。,WM_PAINT消息 WM_PAINT消息是窗口函数WinProc()需要处理的一个很重要消息,该
10、消息牵涉到应用程序的界面维护。当窗口中的用户区域一部分或全部“无效”而需要“刷新”时,都通过该消息实现界面的清理。,当窗口收到WM_PAINT消息时,应用程序窗口将该窗口的客户区重绘。,一、Windows程序架构,响应WM_PAINT消息的主要目的是在客户区域作图。典型的代码如下: case WM_PAINT: hdc = BeginPaint(hWnd, 上述示例代码中,BeginPaint()与EndPaint()函数必须成对调用,并且当且仅当在响应WM_PAINT消息时调用。所有作图代码都必须位于这对函数调用中间,这对函数的第一参数为程序的窗口句柄,第二个参数是指向PAINTSTRUCT
11、(主要用于刷新客户区中的内容)结构的指针。,一、Windows程序架构,WM_DESTROY消息:,(1)消息的生成条件 当窗口被摧毁撤消后(当用户按下ALT+F4键或单击关闭窗口按钮时),Windows向窗口发送WM_DESTROY消息。系统默认的响应是调用DestroyWindow()函数撤消窗口。 (2)消息的处理方法 响应WM_DESTROY消息时,必须要调用PostQuitMessage()函数。该函数向消息队列中放入WM_QUIT消息,使程序退出消息循环,进而退出应用程序。应用程序可在响应这个消息时做一些收尾工作。典型的代码如下: case WM_DESTROY: PostQuit
12、Message(0); break;,9、键盘消息,扫描码与虚拟码,下表给出了常用的虚拟键代码。,按下一个键或者释放一个键,键盘设备就产生一个扫描码(ScanCode),这些扫描码是键盘的物理码,每一个扫描码可以唯一地确定一个按键。为了实现与设备无关的键盘操作,Windows系统中定义了一个虚拟键盘, Windows的键盘驱动程序Keybord.drv实现将各种不同的物理键盘映射到同一个虚拟键盘,程序员处理的是这唯一的虚拟键。,一、Windows程序架构,一、Windows程序架构,对于键盘上的所有键,每次按下或释放时,都会产生击键消息。击键消息主要有四种,分别为WM_KEYDOWN(键按下)
13、、WM_SYSKEYDOWN(系统键按下)、WM_KEYUP(键弹起)、 WM_SYSKEYUP(系统键弹起),字符消息,当按了键盘上的任一个键时,Windows都会向窗口函数发送击键消息,对于那些产生可显示字符的操作,Windows还会向窗口函数发送字符消息WM_CHAR。因此字符消息不是由硬件产生的,而是由可产生显示字符的击键消息转换而来的。,下表给出了击键与消息的关系。,一、Windows程序架构,一、Windows程序架构,10、鼠标消息,Windows系统支持单键(光笔就是模拟单键的鼠标)、双键和三键的鼠标,利用API函数GetSystemMetric()可以检测鼠标是否存在以及鼠标
14、上键的个数。,当用户移动、按下或释放鼠标箭时,都会产生鼠标消息,根据鼠标所处的位置不同(窗口的客户区或非客户区),Windows下的鼠标消息也分为两大类:客户区域的鼠标消息、非客户区域的鼠标消息。,一、Windows程序架构,afx_msg void OnLButtonDown(UINT nFlags, CPoint point);,参数nFlags代表当按下一个鼠标键盘时,各种虚拟键盘上的键或鼠标上的键是否真的被按下,该参数的值有:MK_CONTROL(若按下Ctrl键,则置位),MK_SHIFT(若按下Shift键,则置位),MK_LBUTTON(若按下鼠标左键,则置位),MK_MBUTT
15、ON(若按下鼠标中键,则置位),MK_RBUTTON(若按下鼠标右键,则置位)。,参数point代表客户区坐标中鼠标光标的坐标位置。,一、Windows程序架构,11、消息监测工具Spy+的使用,Windows系统通过传递消息到各个窗口来通知其用户的行为,因此弄清楚应用程序可以接收的消息类型对掌握Windows的编程十分重要。然而Windows系统中有一千个左右的消息,有时候要搞清楚应该处理哪些消息是很困难的。Visual Studio中包含的spy+工具就提供了这种能力,它能显示发送到各个窗口的每一条消息,同时能探测出各个应用程序中的窗口、进程、线程。,一、Windows程序架构,Spy+显
16、示的层次结构反映了系统对象的层次结构:进程拥有线程、线程拥有窗口。,注意有的线程可以没有窗口,有窗口的线程在接收消息时,其优先级别就会提高。这一机制使得Windows的图形用户界面能够快速响应用户的输入。,在开发Windows应用程序的过程中,常常会碰到程序不能正常结束的错误,虽然用户程序窗口已经不存在了,但其进程仍在系统中运行, Spy+的线程窗口能准确地告诉我们当前有多少线程在系统中运行。,一、Windows程序架构,一、Windows程序架构,一、Windows程序架构,一、Windows程序架构,二、应用程序编程接口,1、概述,API,Application Programming I
17、nterface。,API编程是一种原始的开发Windows应用程序模式,主要使用C语言、少量的C+通用类及Windows API。,调用的函数都是比较底层,其地位大致相当于字符界面环境下C语言的标准库函数,只不过其运行环境为Windows的图形界面环境。,在API编程中用到大量的操作系统的结构体变量和控制操作系统的函数,当在使用API函数遇到问题时,可查阅Windows的API文档,位于MSDN的Platform SDK部分。,二、应用程序编程接口,在Windows操作系统中,大多数用户进程依赖于Win32子系统,通过Win32子系统的API请求操作系统的支持。应用程序或服务在用户空间中运行
18、,请求系统服务时,调用由Win32子系统导出的对应函数,然后Win32子系统导出的函数再调用到ntdll.dll中。ntdll.dll向EAX寄存器写入对应的内核函数的索引号,并用EDX寄存器写入调用此函数的用户空间地址,然后发出一个INT 2E终端或调用SYSENTER指令进入到内核中。,2、API结构,二、应用程序编程接口,Windows操作系统核心有三个动态链接库。,Windows内核库(Kernel32.dll):内核库中的函数用于处理操作系统功能的所有核心工作,例如多任务管理、内存管理等。另外内核库还管理系统注册表。 Windows用户界面管理库(User32.dll):用户界面管理
19、库包括了Windows管理、菜单、光标、定时器和通信等有关的函数。在Windows中,窗口的标识被称为“句柄”。 Windows图形设备界面库(Gdi32.dll):图形设备界面库提供了用于管理系统支持的所有图形设备函数,包括屏幕、打印机等设备的管理。GDI库中的函数为应用程序提供与设备无关的绘图内容。应用程序中通过GDI库中的函数绘图,不是直接面向硬件操作,而是通过“设备描述表”来进行操作,它通过句柄hDC来跟踪。,Windows三个核心库中的API函数的原型声名在windows.h中有说明,这就是我们在编写Win32应用程序时要在程序开头放#include “windows.h”语句的原因
20、。,3、核心API库,二、应用程序编程接口,4、Windows API分类,内核服务 通过内核服务函数,应用程序可以使用计算机中的资源和操作系统的特性,例如内存,文件系统、设备、进程、线程等。拿一个简单的文件输入输出函数来说,通过这些函数,程序员可以存取本地计算机或网络中某台计算机中的文件、目录、输入输出设备,并且这些文件函数支持各种各样的文件系统,包括FAT、NTFS的文件系统。 内核服务体现了Windows操作系统“服务”的观点。作为一个程序员我们应该利用这些服务函数来充分发挥操作系统的功能。对于这部分API函数的使用,我们可以在基于控制台的应用程序中编写,因为这些函数都是一些与Windo
21、ws图形用户界面无关的,在字符方式下操作比较简单。后面有关这方面函数的操作就是在基于控制台的应用程序中使用的。 内核服务的函数大部分包含在Windows内核库Kernel32.dll中。,二、应用程序编程接口,图形设备接口 图形设备接口是Windows最原始的图形输出库(最原始意味着除了GDI外,还有工业界用的OpenGl和游戏界用的DirectX,VC都对他们提供支持)。当看到图形或文本显示在屏幕上时,这就是GDI的功劳。它提供了在显示器、打印机或其它设备上生成图形的函数与相关的数据结构。利用GDI函数,你可以画直线、曲线、文本、位图等。你还可以使用各种各样的绘图对象如笔、画刷、字体等,使得
22、所绘制的图形更加丰富多彩。另外,Windows本身也是通过GDI来绘制其用户界面,包括窗口、菜单和对话框。 顾名思义,图形设备接口是与图形界面有关的,因此这些函数的使用要在图形用户界面下操作,即必须建立基于Win32的应用程序。 图形设备接口的函数是包含在Windows图形设备界面库Gdi32.dll中。,二、应用程序编程接口,用户接口服务 用户接口服务函数可以创建和使用Windows来显示输出、提示用户输入和执行与用户交互的任务。用户接口服务是通过一些常见的Windows对象来实现的,例如按钮、组合框、编辑框、菜单、键盘输入、定时器等。 用户接口服务的函数是在Windows用户界面管理库Us
23、er32.dll中。 网络服务 网络服务允许分布在网络中不同计算机上的应用程序进行通讯。通过这些函数可以创建和管理共享资源,例如共享目录和网络打印机。 网络服务的函数是在网络接口函数库Mpr.dll、Wininet.dll和Winsock32.dll中。 多媒体服务 多媒体技术是指利用计算机综合处理多媒体信息文本、图形、图象和声音等,使多种信息建立逻辑连接,集成为一个系统并具有交互性。多媒体服务提供了数字音频、视频、图形、图象等服务。 该服务的函数主要包含在多媒体函数库Winmm.dll中。,二、应用程序编程接口,客户/服务器方式存取服务 在客户/服务方式存取模式中,客户可以连接到服务器上以使
24、用服务器的功能和数据,服务器通过客户端的标识和权限来决定客户端可以使用的功能。Win2K提供了一套函数来限制和允许客户端对服务端的访问。这些函数扩展了Win2k的存取控制模型来使用服务端的私有对象和使用服务端的功能。客户/服务方式存取服务又称操作系统高级编程接口,这些函数包含在高级编程接口函数库Advapi32.dll中。 版本服务 版本服务主要提供有关文件的版本信息。这些服务所对应的函数包含在版本函数库Version.dll中。 公共对话框服务 公共对话框,又叫通用对话框,是Windows预定义的对话框,可以使用通用对话框来执行六种标准操作,选择文件,指定字体、选择颜色、打印设置、查找文本、
25、保存文件。这些服务所对应的函数包含在公共对话框函数库Comdlg32.dll中。,打印管理服务 在Windows操作系统下,可以实现在各种设备下的打印。打印管理服务提供了完整的函数集支持这些操作,例如检索打印机,准备打印等。这些服务所对应的函数包含在打印管理函数库Winspool.drv中。 解/压缩文件服务 该服务提供了对文件的压缩和解压服务。这些服务所对应的函数包含在函数库Lz32.dll。 在VC6.0中提供了一个文件Win32api.csv。它是一个Win16与Win32函数的对照表。通过它读者可以浏览到Windows各种版本下API函数的原型说明。,二、应用程序编程接口,二、应用程序
26、编程接口,5、文件操作,VC下提供了对文件操作的四种方式: (1)使用C语言中的fopen()、fprintf()、fread()等基本的函数进行文件操作; (2)使用C+中的流式文件接口fstream中的函数进行操作; (3)使用面向对象的类CFile进行操作; (4)使用有关的文件API进行操作。,二、应用程序编程接口,API为一般的文件操作提供了三个函数:移动、复制和删除。 文件拷贝的API函数如下所示: BOOL CopyFile( /从源文件向目标文件复制内容 LPCTSTR lpExistingFileName, / 源文件名称 LPCTSTR lpNewFileName, / 目
27、标文件名称 BOOL bFailIfExists /*目标文件存在时的操作模式,为true时,函数调用失败,为False时,现有文件将被覆盖*/ );,文件移动和文件删除的API函数是MoveFileEx()和DeleteFile()。,Windows内核功能的实现不一定要在Windows的图形界面下完成,在字符方式下也可以。,二、应用程序编程接口,#include / windows操作系统API函数的头文件 #include void main() char SourceFileNameMAX_PATH; char DestFileNameMAX_PATH; BOOL Success; c
28、outSourceFileName; coutDestFileName; Success=CopyFile(SourceFileName,DestFileName,TRUE); /调用API函数CopyFile实现文件拷贝 if (!Success) cout拷贝失败,错误的代码为: GetLastError()endl; /调用API函数GetLastError()求出错的代码 else cout文件拷贝成功n; ,二、应用程序编程接口,6、进程操作,Windows是多任务操作系统,支持两种类型的多任务:一种是多进程,另一种是多线程。进程是应用程序的运行实例,它是应用程序的一次动态执行。所谓
29、的多进程就是,Windows允许多个程序同时驻留在内存或同一个应用程序可以在内存中有多个副本。进程指独立运行着的应用程序。当启动Word字处理程序,便启动了一个进程。同样,当我们编译并运行我们自己所编写的一个VC程序时,也启动了一个进程。下面的例子就要演示在一个控制台的应用程序中,启动Windows附件中的“记事本”程序,从而启动一个新的进程。,进程的创建 Windows以对象的方式来管理进程的,它由Win32子系统来创建和维护,并且可以由此进程的句柄来进行管理。进程创建是调用Win32 API函数CreateProcess()来实现,创建后的进程可以和原进程共享资源(例如句柄和变量)。在Wi
30、ndows中,这两个进程不存在紧密的父子关系,即使原进程终止后,这个新进程仍然可以继续执行。,二、应用程序编程接口,进程创建函数的原型说明,BOOL CreateProcess( LPCTSTR lpApplicationName,/ name of executable module LPTSTR lpCommandLine, / command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, / han
31、dle inheritance option DWORD dwCreationFlags, / creation flagsLPVOID lpEnvironment, / new environment block LPCTSTR lpCurrentDirectory,/current directory name LPSTARTUPINFO lpStartupInfo, /startup information LPPROCESS_INFORMATION lpProcessInformation/process information);,二、应用程序编程接口,参数说明: lpApplica
32、tionName:是一个以NULL结尾的字符串指针,指向待执行的可执行文件名字,它可以为全路径,也可以只是单独一个文件名。如果只是一个单独的文件名,则系统会在当前路径下寻找,然后在系统目录和PATH所指的目录中去查找。 lpCommandLine:一个以NULL结尾的字符串的指针,指向命令行参数。 lpApplicationName:和参数lpCommandLine不允许同时空,否则系统找不见新进程所对应的可执行程序的文件名。 lpProcessAttributes和lpThreadAttributes:用来确定新进程和它的主线程的安全属性,即用来决定所返回的句柄是否可以被这个新进程的子进程继
33、承。它们都是指向SECURITY_ATTRIBUTES结构的指针,若它们为NULL,则不能被继承。 bInheritHandles:用来确定新建进程能否继承产生它的进程的句柄。若它的值为TRUE,则这个进程和线程所建立的句柄都可以被这个进程所建立的新进程所继承,即继承的句柄和原先的句柄有相同的值和存取权限。,二、应用程序编程接口,dwCreationFlags:该参数决定新进程产生的方式,它可以用逻辑或的方式把下列值组合起来: lpEnvironment:指向环境块内存的指针,若该值为NULL,则新进程和父进程使用相同的环境块。 lpCurrentDirectory:新进程的工作目录和驱动器,
34、若其为NULL,则新进程的工作目录和驱动器与父进程相同。 lpStartupInfo:这是一个指向STARTUPINFO结构的指针,说明新进程以怎样的形式加以显示。 lpProcessInformation:一个指向PROCESS_INFORMATION结构的指针,用来存放返回值。如果函数CreateProcess成功被调用,则返回TRUE,否则返回FALSE。如果函数返回FALSE,则可以调用函数GetLastError取得进一步的错误信息。,二、应用程序编程接口,7、网络接口服务,如何开发网络应用程序,最基本的是搞清楚Windows操作系统对网络的支持。对程序员来说,要掌握网络编程的一些概
35、念,最终掌握有关网络使用的一些API函数。,套接字的使用与Winsock API;,因特网服务WinInet。,二、应用程序编程接口,套接字(socket)是一种网络编程接口,它是对通信端点的一种抽象,提供了一种发送数据和接收数据的机制。Winsock是Windows操作系统下的套接字,它是一套Microsoft Windows下的网络编程接口,使用该接口可以充分利用Windows消息驱动机制进行编程,在应用程序中是通过调用WinSock API实现相互之间的通讯。,初始化套接字 在使用Winsock进行编程之前,必须对它进行初始化,使用WSAStartup()就可以完成。该函数的原型为: i
36、nt WSAStartup( WORD wVersionRequested,/ Socket动态链接库的版本号 LPWSADATA lpWSAData /指向一个WSADATA数据结构, /该数据结构返回Windows Socket实现的详细信息 ); 第一个参数指明了要调用的Socket动态链接库的版本号;第二个参数为指针类型,指向一个WSADATA数据结构,该数据结构返回Windows Socket实现的详细信息。 该函数通过一个过程调用来完成使用Windows中Socket动态链接库的初始化工作,它调用成功后就可以调用Windows Socket API函数。,二、应用程序编程接口,Wi
37、nInet是Windows Internet扩展应用程序的接口,它包含了一个C语言的函数集。使用WinInet可以为应用程序添加向InterNet服务器的连接,而无需考虑基本的通讯协议和底层的数据传输工作。WinInet支持文本传输协议(FTP)、超文本传输协议(HTTP)等。,利用WinInet检测计算机是否接入因特网及接入方式 在开发网络应用程序的时候,如果设计到Internet方面的处理问题,则首先必须要能判断当前计算机是否接入Internet。因为,如果用户当前的计算机没有接入网的话,随后的任何操作过程都必出现错误。我们可以通过软件的方式检测当前计算机是否接入Internet及当前的接
38、入方式。,二、应用程序编程接口,WinInet中的API函数InternetGetConnectedState 通过API函数InternetGetConnectedState可以检测当前计算机是否接入Internet及接入的方式。该函数原型为:,BOOL InternetGetConnectedState( OUT LPDWORD lpdwFlags, IN DWORD dwReserved );,该函数第一个参数表示网络的接入类型,第二个值保留,一般取0,当函数返回值为真时,代表已经接入因特网。否则,没有接入。,三、动态链接库,1、概述,动态链接库(Dynamic Link Library
39、,简称DLL)是一个包含了若干函数的可执行模块,它实质上是一个函数包,Windows应用程序可以调用这些函数来完成实际的任务。DLL在Windows环境中起着重要的作用Windows 利用 DLL来建立Windows应用程序可以使用的Windows函数与资源。,动态链接库是一个文件,其中包含有函数或全局变量,使用他们就像应用程序使用自己定义的函数一样。用API开发Windows应用程序,实质就是调用Windows操作系统下的动态链接库。,三、动态链接库,2、动态链接与静态链接,DLL与运行函数库(如C语言的运行函数库)类似,二者主要区别在于库代码的链接时机不同。,静态链接库在多任务环境中建立与
40、运行时效率可能很低。一方面,如果两个应用程序同时运行,且它们使用了同一个静态库中的函数,那么就要求系统中出现该函数的两个副本,这显然降低了内存的使用效率。另一方面,对于比较复杂的问题,应用静态链接库将导致最终的应用程序长度超过系统内存而无法运行。,DLL是在运行期间才被链接进来,该操作由Windows操作系统自身来完成,而运行函数库则是在程序链接期间由应用程序的链接器如LINK.EXE来完成,运行函数库的链接被称为“静态链接”,它把函数代码链接到应用程序中,增加了应用程序最终执行代码的长度。它的主要优点是建立了一个应用程序可以利用的标准函数集,这样在开发应用程序时就无需包含函数库中所包含的函数
41、源代码。,与静态链接库不同,动态链接库则允许若干个应用程序共享某个函数的单个副本。事实上,每个Windows API函数,如GetMessage()、CreateWindow()和TextOut()分别位于动态链接库 Kernel32.dll、User32.dll、Gdi32.dll之中。如果两个应用程序同时运行,且都使用了某个特定的Windows函数,那么它们将共享该函数代码的单个副本。DLL除了实现代码的共享外,还可以实现其它资源的共享,如数据和硬件资源的共享。Windows的设备驱动程序允许应用程序共享硬件资源,这些设备驱动程序就是以动态链接库的形式来出现。,从某种程度上讲,动态链接库也
42、是一种类型的计算机资源。一个动态链接库可以为多个应用程序使用,如果一个应用程序使用了某个动态链接库中函数,若库不存在,则调用将不能完成。,三、动态链接库,动态链接库DLL是一个可执行程序模块,模块中包含了可以被其他应用程序或其他DLL共享的程序代码和资源。,采用DLL的优点: 当多个进程同时使用同一个DLL时,只要在内存中装入它的一个副本即可,从而可以节省内存; DLL与调用它的应用程序相分离,因此可以在不修改应用程序的情况下对DLL进行更新; 只要在调用DLL中的函数时遵循相同的调用规范,那么DLL中的函数就可以被各种编程语言编制的应用程序调用。,三、动态链接库,3、DLL到进程地址空间的映射,装入时刻动态链接,三、动态链接库,三、动态链接库,运行时刻动态链接,在运行时刻,通过调用LoadLibrary可以使DLL加载到一个进程的地址空间中。 为了在运行时刻从DLL中调用一个函数,可以通过调用GetProcAddress获取函数的地址。,DLL到进程地址空间的映射,三、动态链接库,三、动态链接库,4、函数的导出与导入,动态链接库是一个.DLL文件 ,它存放在特定的位置上。程序员所创建的动态链接库中的函数要有导出标志,在使用动态链接库中的函数的程序中,要具有导入标志。,动态链接库中的函数并不是杂乱无章地堆放在一起,它们都有一个标志,即动态链接库中的导出标志。同样,如果应用程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西医科大学公开招聘博士人才68人笔试备考题库及答案解析
- 成都佳兴外国语学校2026年公开招聘教师笔试备考题库及答案解析
- 2026年济宁市市直卫生健康系统“校园双选会”补充笔试模拟试题及答案解析
- 2026四川广安市市场监督管理局遴选5人笔试备考试题及答案解析
- 2026广东第二师范学院附属陆河中学招聘临聘教师8人笔试模拟试题及答案解析
- 2026海南大学外国语学院招聘紧缺专业(语言类)外籍教师1人考试备考题库及答案解析
- 2026四川遂宁市就业服务管理局面向社会招聘1名编外人员备考题库及答案详解【有一套】
- 2026广东东莞市望牛墩镇中心幼儿园招聘备考题库带答案详解(考试直接用)
- 2026海南海口市美兰区校园招聘教师45人备考题库(一)附参考答案详解【预热题】
- 2026广东东莞市望牛墩镇中心幼儿园招聘备考题库及参考答案详解(培优)
- 学校饮用水污染事件应急报告与管理制度
- 2026年粤港澳大湾区建筑市场发展新机遇
- 2026年北大emba考试试题
- 幽门螺杆菌相关性胃炎中胃内菌群与抗菌肽表达的协同变化及临床意义
- 2026年高压电工证考试试题及答案
- 注塑岗位安全培训课件
- 2025年高职(城市轨道交通机电技术)设备调试阶段测试题及答案
- 2026年考试题库北汽集团高管知识水平测试
- 核电防异物管理指南(核心版)
- 电厂防汛课件
- 人工智能在高职机械专业教学中的应用研究
评论
0/150
提交评论