windows编程考试终极复习资料2.0

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Win32应用程序编程接口(API)。1.3windows版本WindowsServer2003定位于企业和服务器应用。1.7准备win64Win32和Win64的本质差异是指针变量的大小(win64是64位)以及虚拟地址空间的大小。2.1windows文件系统Windows支持4种文件系统。1.NT文件系统(NTFS)。2.文件分配表(FAT&FAT32)。3.CD-ROM文件系统(CDFS)。4.通用磁盘格式(UDF)。只有NTFS支持安全性。2.2文件名目录和文件名不能包含任何ASCII字符在1-31之间的字符或者以下字符:*?”“\/目录和文件名称不区分大小写,但可以保留大小写。2.4.2main函数C的main函数及其参数列表(argv[]),应该被宏tmain所代替。2.11.2目录管理创建或者删除目录涉及到一对简单函数:BOOLCreateDirectory(LPCTSTRlpPathName,LPSECURITY_ATTRIBUTESlpSecurityAttributes)BOOLRemoveDirectory(LPCTSTRlpPathName)3.5文件属性和目录处理有可能在目录中查找满足指定命名方式的文件和目录,同时获取文件属性。查找操作需要函数FindFirstFile获取的查找句柄,使用FindNextFile来获取指定的文件,以及使用FileClose终止查找。3.5.2获取文件和目录属性的其他方式FindFirstFile和FindNextFile函数可以获取一下文件属性信息:属性标记、三个时间戳和文件大小。3.5.3临时文件名该名称可用于任何指定的目录,而且必须是唯一的。3.9文件处理策略C库提供了一些不同的优点,包括如下:1)代码可以移植到非windows平台。2)便捷的面向行和字符的函数,而windows中没有相对应的函数来化简字符串处理。3)C库函数通常比windows函数更易于使用。4)面向行和流字符的函数易于改变以进行普通调用,尽管失去了可移植性特定。5)C库可以在多线程环境下运行。C库也有一些限制。如下:1)C库不能管理或遍历目录,也不能获取或设置大多数文件属性。2)C库在fseek函数中使用32位的文件位置,所以在顺序读取巨大文件的同时,却不能根据需要定位巨大文件的任何地方。3)C库中没有高级特性,比如文件安全性、内存映射文件、文件锁、异步I/O和进程间通信。3.10文件锁定文件锁可以是只读(共享)或读写(专有)。最重要的是锁属于进程。最普遍的函数是LockFileEx,其次是LockFile。在使用文件锁是应考虑以下因素:1)解锁应该同前面锁定使用完全相同的范围。2)锁不能跟文件现有的锁有重叠,否则会产生冲突。3)锁可以超出文件的长度范围,该方法在进程或线程扩展文件时有用。4)锁不能被新建的进程继承。3.11注册表注册表是关于程序和系统配置信息的集中的分层的数据库。对注册表的访问是通过注册关键字来实现的,他跟文件系统目录相似,关键字可以包含其他关键字或名称/值对,他跟文件名称和内容是类似的。注册表名称/值对包含如下信息:1)操作系统版本号、编译号和注册用户。2)每个正确安装程序的相似信息。3)计算机处理器类型、处理器数量、系统内存等等信息。4)用户特定信息,比如主目录和程序选项。5)安全信息,比如用户账号。6)从文件扩展名刀可执行程序的映射。这些映射在用户点击文件名图标时通过用户界面shell使用。例如.doc扩展名映射到微软的word程序。7)映射网络地址到主机名。4.3错误和异常*错误可以被当做一个可知位置偶然发生的事件,例如系统调用错误应该能被代码段中的逻辑立即检测和汇报。这样,程序一般包含明确的测试逻辑以判断文件读取操作是否有误,第二章采用ReportError函数来诊断并响应错误。另一方面,异常可能会在任何地方发生,而要对异常进行测试是不可能或不现实的。例如除以零和内存访问违规就是实际例子。虽然如此,但是两者的区别有时是模糊的。Windows可以在内存分配过程中使用HeapAlloc函数产生异常,二档内存不足时使用HeapCreat函数。程序可以通过使用RaiseException函数的程序员定义的异常代码来引起异常。异常处理器提供了不使用goto或longjmp移交控制权,从而程序控制下的内部程序块或函数中推出的一个便利机制。当程序块访问资源,比如打开文件,内存或同步对像时,这种能力尤其重要,因为处理器可以释放他们,也有可能在异常处理器之后继续程序执行而不是终止程序,另外,当程序块中断退出时,程序可以恢复系统状态,比如浮点掩码。用户定义异常:RaiseException函数:VIODRaiseException(DWORDdwExceptionCode,DWORDdwExceptionFlags,DWORDcArguments,CONSTDWORD*lpArguments)4.5终止处理器终止处理器跟异常处理器的作用是相同的,但是程序当线程由于正常程序流程程序块离开以及异常发生时,他才会执行。另一方面,终止处理器不能诊断异常。在try-finally语句使用_finally关键字来构建中止处理器。4.8控制台控制处理器异常处理器可以对不同的事件做出响应,但是它们不能探测到诸如用户注销或者从键盘上输入Ctrl-c以停止程序等之类的情形。控制台控制处理器可用于探测此类事件。4.10矢量异常处理矢量异常处理(VEH)管理跟控制台控制处理器管理是相似的,尽管细节有所不同。可以使用AddVectoredExceptionHandler来增加或注册一个处理器。PVOIDAddVectoredExceptionHandler(ULONGFirstHandler,PVECTORED_EXCEPTION_HANDLERVectoredHandler)5.2堆Windows以堆得方式来维护内存池。一个进程可以包含多个堆,可以从浙西堆中分配内存。对于不同的数据结构,使用不同堆来分配有时是很方便的,不同堆的有点包括:1)公平。没有哪个线程可以获得比分配给其堆得内存还要多的内存,特别是由于程序忘记释放不在需要的数据单元而引起的内存泄漏缺点,只影响进程中的某个进程。2)多线程性能。每个线程具有自己的堆,线程之间的抢夺会减少,这充分提高了性能。3)分配效率。在小堆内分配固定大小的数据单元比在巨大的堆内分配许多不同大小单元的效率更高。分段也减少了。而且,每个线程具有唯一的堆简化了同步,所以产生了更高的效率。4)解除分配效率。整个堆及其包含的所有数据结构可以用单个函数调用来释放。该调用同时也释放堆中任何泄漏的内存分配。5)引用局部化的效率。在一个小堆维护数据结构确保单元限制在相对少量的页面中,这无形中减少了数据结构单元处理时的页面错误。注意:堆没有安全属性,因为他在进程之外是不可以访问的。要销毁整个堆,使用HeapDestroy。这是CloseHandle函数移除不需要的句柄的规则例外。BOOLCloseHandle(HANDLEhHeap)5.3管理堆内存通过指定堆句柄、块大小和几个标记来从堆中获得内存块的函数:LPVOIDHeapAlloc(HANDELhHeap,DWORDdwFlags,SIZE_TdwBytes)返回值:正常时返回已分配内存块的指针,失败时返回NULL(除非预先指定异常处理方式)。解除堆内存分配的函数:BOOLHeapFree(HANDLEhHeap,DWORDdwFlags,LPVOIDlpMen)内存块可以重新分配以改变其大小函数如下:LPVOIDHeapReAlloc(HANDLEhHeap,DWORDdwFlags,LPVOIDlpMen,SIZE_TdwBytes)返回值:正常时返回重新分配内存块的指针,失败时返回NULL,或产生异常。通过堆句柄和块指针来调用HeapSize以决定分配块的大小。DWORDHeapSize(HANDLEhHeap,DWORDdwFlags,LPVOIDlpMen)返回值:正常时返回分配内存块的大小,失败时返回零。5.3.4小结:堆管理使用堆得通常过程如下1)使用CreateHeap或者GetProcesSEHap来获取一个堆句柄。2)使用HeapAlloc在堆内分配块。3)可选的,使用HeapFree释放一些或所有的单个块。4)使用HeapDestroy删除堆并关闭句柄。5.5内存映射文件Windows内存映射文件功能也可以将虚拟内存空间直接映射到普通文件。这有几个优点:1)没有必要执行直接的文件I/O(读写)。2)在内存中创建的数据结构将会保存在文件中,以便以后被相同的或不同的程序使用。3)方便而有用的内存算法(排序、查找树、字符串处理等等)可以处理文件数据,即使该文件可能比可用的物理内存要大得多。如果文件比较大,那么性能挥手道页面调度行为的影响。4)文件处理性能在同样情况细也能充分提升。5)没有必要管理缓存及其所含文件数据。操作系统能有效而可靠的完成这一艰巨任务。6)多个进程可以共享内存,通过映射虚拟地址空间到相同的文件或到页面调度文件中(进程间内存共享是映射到页面调度文件的主要原因)。7)没有必要消耗页面调度空间。5.9.1静态和动态库DLL是文件映射最明显和重要的应用。创建进程常用函数,比如ReportError,可以放入一个库中以简化创建进程。这种单映像模式简单,但又几个缺点1)可执行映像可能很大,在运行时消耗硬盘空间和物理内存,并需要过多的精力来管理机交付给用户。2)每次程序更新需要编译整个程序,即使改变很小或局部的。3)系统中使用该函数的每个程序在其可执行映像中都具有该函数的一个副本,可能包含不同版本,这种安排增加了磁盘空间,或许更重要的是,当几个这样的程序同时运行时会增加物理内存的使用频率。4)使用不同技术的不同程序版本则要求在不同的环境下获取最佳性能。DLL(优点)巧妙大的解决了这些及其他问题1)库函数在创建程序时没有连接。相反,他们在程序装载时(隐式连接)或者运行时(显式链接)链接。结果,程序映像可以小很多,因为他不包含函数库。2)DLL可用于创建共享库。多个程序以DLL德形式共享单个库,而只有一个副本装载到内存中,所有程序映射到他们进程的地址空间到DLL代码中,尽管每个线程在堆栈中具有自己不共享的存储副本。3)新版本或替代实现可以通过提供一个新版DLL来实现,而所有使用该库函数的程序无需修改就可以使用该新版本。4)有了显式链接,程序也可以在运行时决定应该使用哪个版本的库。不同的库可能是同一函数的代替实现,也可能执行完全不同的任务,就像不同程序一样。同用程序一样,哭在同一进程和线程中运行。多个进程可以共享DLL代码,而且可以使用调用线程的堆栈。所以DLL具备线程安全性。5.11DLL入口点串口化是必须的,因为DllMain必须在没有中断的情况下执行完初始化。5.12DLL版本管理DLL的一个主要优点是多个程序可以共享单个实现。然而该能力导致了兼容复杂性,正如下所述:1)新函数会增加,是的隐式连接程序在链接.LIB文件时所假定的偏移量无效。而显式链接则避免了这个问题。2)新版本会改变行为,引发现有未更新的程序问题。3)依赖新DLL函数的程序有时链接着较老的DLL版本。DLL兼容性问题解决方案:1)使用DLL版本号作为.DLL和.LIB文件名的一个组成部分,通常是作为后缀。例如Utility_3_0.DLL和Utility_3_0.LIB就用于本书web站点和所有跟本书版号相关的项目范例。通过使用隐式或显式链接,程序可以确定版本需求并使用不同的名称来访问文件。改方案常用于UNIX程序。2)微软引入了并行DLL或者汇编和组件概念。该解决方案需要在程序中增加一个用XML编写的声明以定义DLL需求。3).NET架构提供了并行执行的附加支持。6.1windows进程和线程每个进程包含一个或多个线程,而windows线程是最基本的可执行单元。进程的每个线程共享代码、全局变量、环境字符串和资源。每个线程都独

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功