友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第34章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




操作:  


…………………………………………………………Page 156……………………………………………………………

 l 保留进程虚拟地址空间中的一段 保留地址空间并不为它们分配物 

  理存储,而只是防止其它分配操作使用这段空间。它并不影响其 

  它进程的虚拟地址空间。保留页防止了对物理存储的不必要的浪 

  费,然而它允许进程为可能增长的动态数据结构保留一段地址空 

  间,进程可以在需要的时候为这些空间分配物理存储。  



 l 占用进程虚拟地址空间中的保留页的一部分,以使得物理存储 (无 

  论是RAM还是磁盘空间)只对正在进行分配的进程可用。  



 l 指定允许读写存取、只读存取或不允许存取的占用页区域。这和 

  标准的分配函数总是分配允许读写存取的页不同。  



 l 释放一段保留页,使得调用线程在随后的分配操作中可以使用这 

  段虚拟地址。  



 l 取消对一段页的占用,释放它们的物理存储,使它们可以其它进 

  程在随后的分配中使用。  



 l 在物理内存RAM中锁定一个或多个占用页,以免系统将这些页交换 

  到页面文件中。  



 l 获得关于调用线程或指定线程的虚拟地址空间中的一段页的信 

  息。  



 l 改变调用线程或指定线程的虚拟地址空间中指定占用页段的存取 

  保护。  



虚拟内存函数对内存页进行操作。函数使用当前计算机的页大小来对 

指定的大小和地址进行舍入。  



可以使用函数GetSystemInfo来获得当前计算机的页大小。  



函数VirtualAlloc完成以下操作:  



 l 保留一个或多个自由页。  



 l 占用一个或多个保留页。  



 l 保留并占用一个或多个自由页。  



你可以指针所保留或占用的页的起始地址,或者让系统来决定。函数 

将指定的地址舍入到合适的页边界。保留页是不可访问的,但占用页 

可以使用标志位PAGE_READWRITE、PAGE_READONLY和PAGE_NOACCESS来 


…………………………………………………………Page 157……………………………………………………………

分配。当页被占用时,从页面文件中分配存储空间,每个页仅在第一 

次试图对其进行读写操作时被初始化并加载到物理内存中。可以用一 

般的指针引用来访问由VirtualAlloc函数 占用的页。  



函数VirtualFree完成下面的操作:  



  l 解除对一个或多个页的占用,改变其状态为保留。解除对页的战 

   胜释放与之相关的物理存储,使其为其它进程可用。任何占用页 

   块都可以被解除占用。  



  l 释放一个或多个保留页块,改变其状态为 自由。释放页块使这段 

   保留空间可以为进程分配空间使用。保留页只能通过释放由函数 

   VirtualAlloc最初保留的整个块来释放。  



  l 同时解除对一个或多个占用页的占用并释放它们,将其状态改变 

   为自由。指定的块必须包括由VirtualAlloc最初保留的整个块, 

   而且这些页的当前状态必须为占用。  



函数VirtualLock允许进程将一个或多个占用页锁定在物理内存RAM 

中,防止系统将它们交换到页面文件中。这保证了一些要求苛刻的数 

据可以不通过磁盘访问来存取。将一个页锁定入内存是很危险的,因 

为它限制了系统管理内存的能力。由于可能会将可执行代码交换到页 

面文件中,可执行程序使用VirtualLock将有可能降低系统性能。函 

数VirtualUnlock解除VirtualLock对内存的锁定。   



函数VirtualQuery和VirtualQueryEx返回关于以进程地址空间中某一 

指定地址开始的一段连续内存区域的信息。VirtualQuery返回关于调 

用线程内存的信息。VirtualQueryEx返回指定进程内存的信息,这通 

常用来支持调试程序,这些程序常常需要知道关于被调试进程的信 

息。页区域以相对于指定地址最接近的页边界为界。一般来说,它通 

过具有下述属性的后续页来进行扩展:  



所有页具有相同的状态,或为占用,或为保留,或为自由。  



如果初始页不为自由,区域中的所有页都属于通过调用VirtualAlloc 

保留的同一个最初页分配。  



所有页的存取保护相同,或为PAGE_READONLY,或为 

PAGE_READWRITE,或为PAGE_NOACCESS。  



函数VirtualProtect允许进程修改进程地址空间中任意占用页的存取 

保护。举例来说,一个进程可以分配读写页来保存易受影响的数据, 


…………………………………………………………Page 158……………………………………………………………

然后将存取改变为只读或禁止访问,以避免无意中被重写。典型的, 

VirtualProtect用于使用VirtualAlloc分配的页,但事实下,它也可 

以用于通过其它分配函数占用的页。然而,VirtualProtect改变整个 

页的保护状态,而由其它函数返回的指针并非总是指向页边界。函数 

VirtualProtectEx类似于VirtualProtect,但函数VirtualProtectEx 

可以改变指定进程的内存的保护状态。改变这些内存的保护状态在调 

试程序访问被调试进程的内存的非常有用。  


…………………………………………………………Page 159……………………………………………………………

       第四章 基于对话框的应用程序  



从本章我们将学习如何使用Visual   C++进行真正意义上的Windows应 

用程序设计。对于编程者来说,最简单的实用程序应该是本章所要讲 

述的基于对话框的应用程序。当然,我们已在前面的章节中介绍了基 

于包括用户区的一般窗口的最简单的Windows程序,相比本章将要讲 

述的程序来说,它们还要更简单一些。但是要记住,在前面讲述的这 

些应用程序中,我们没有实现任何实际的功能。事实上,在这些应用 

程序中,实现一些哪怕是很简单的功能也需要很多的代码量。举一个 

例子,如果我们需要在用户区绘制图形或文本的话,就需要为 

Windows消息WM_PAINT编写消息处理函数。一个实用的Windows应用程 

序的WM_PAINT 的消息处理过程常常会很庞大和很复杂。而对于在这章 

将要讲述的基于对话框的应用程序来说,整个应用程序都是由一个或 

多个对话框 (dialog  box)组成,对话框只是作为其它一些行为标准化 

了的窗口(我们叫它们控件 (control))的容器,其行为也是标准化了 

的。这样,Windows就可以为这些行为标准化了的窗口实现很多默认 

的操作,而不需要我们进行更多的干预。比如对于一个文本框,我们 

只需要预先设定文本框的文字及其它一些属性,Windows就可以知道 

在不同的情况下这个文本框应该进行什么样的操作,因为它的行为, 

如编辑和选定文本等,都已经是标准化了的。虽然各种各样的控件各 

有各的特点,但是,对于一类控件来说,它们的行为在某种意义是一 

致的。(从这个意义上来说,这是面向对象程序设计的很大程度上的 

优点所在。)  



使用MFC编写的对话框应用程序和使用SDK编写的对话框应用程序在结 

构上有着很大的不同。对于使用Visual  C++的程序员来说,我们有充 

分的理由使用MFC来编写这些应用程序,因此,我们在这里将不讲述 

如何使用SDK编写的基于对话框的应用程序。  



本章涉及的内容包括:  



  l 使用AppWizard生成基于对话框的框架应用程序  



  l 由CWinApp派生的应用程序类  



  l MFC的消息映射机制及其实现  



  l 对话框及由CDialog派生的对话框类  



       第一节 使用AppWizard生成应用程序框架  


…………………………………………………………Page 160……………………………………………………………

在编写MFC应用程序时,我们通常使用AppWizard来生成应用程序框 

架,然后再在此框架的基础上来添加特定于应用程序的功能的实现。 

在计算机术语中,Wizard通常被译作向导 (AppWizard即应用程序向 

导),它是这样的一种程序:你只需要回答一系列的与你所需完成的 

操作�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!