VC++技术内幕(windows编程篇)(13)
的内存块,特定执行线程的局部内存,所有系统内存模块(包括虚拟内存表),Windows核心、执行过程及DLL(是OS的一部分)。
2,Windows 95进程地址空间:
WIN95中,只有底下的2GB(0-0x7FFFFFFF)地址空间是进程私有的。其中最底下的4MB禁止访问。堆栈、堆和可读写的全局内存,及其应用程序的EXE和DLL文件都被映射底下的2GB地址上。
上面的2GB地址空间对所有的进程都一样的,由所有的进程共享。
WIN95核心、执行过程、虚拟设备驱动程序和文件系统代码,以及一些重要的表(如:页表),都被映射到最上面的1GB(0xC0000000-0xFFFFFFFF)地址空间。
Windows DLL和内存映射文件位于0x80000000-0xBFFFFFFF地址空间。 安全性说明:
1)所有的EXE和DLL代码都有只读标记,因而可以映射到几个不同的进程中。 2)一个进程不可能改写另一个进程私有的2GB地址空间内容。
3)进程地址空间中最上面的2GB由于是共享的,很容易受攻击毁坏。如:错误进程毁坏这一区域重要的系统表,进程的内存映射文件被其它进程弄乱。
3,Windows NT进程地址空间:
WIN NT中,进程只能访问它最底下的2GB地址空间(除最底和最高的64K是不能访问)即:0x00010000-0x7FFEFFFF。
EXE、应用程序的DLL 和 Windows的DLL、以及内存映射文件都驻留在0x00010000-0x7FFEFFFF地址空间中。
Windows NT内核、可执行程序和设备驱动程序都被映射到上面的2GB空间中,完全受保护,可以避免错误程序的侵入。
安全性分析:
1)进程内存地址空间上2GB空间,完全受保护,可以避免错误程序的侵入破坏其中内容。
2)内存映射文件更安全,如果不知道文件的名字,而又没有显式地映射视图,一个进程不能访问另一个进程的内存映射文件。
4,实际中RAM一般没有GB级别,Windows是使用虚拟镜像技术的(通过内存与磁盘的页置换完成的)。
5,程序中如果需要动态内存,可使用Win32函数VirtualAlloc和VirtualFree函数,也可以直接使用Windows 堆函数(如:HeapAlloc 和 HeapFree)和CRT函数(C运行库堆函数,如malloc,new,free,delete)来完成任务。
6,堆是特定进程的内存池。当程序需要内存块的时候,调用堆内存分配函数,并在使用完时调用相关的堆内存释放函数释放内存。
Windows 堆函数(如:HeapAlloc 和 HeapFree)和CRT函数(C运行库堆函数,如malloc,new,free,delete).
C++代码中,new,delete函数直接映射到malloc,free函数。 说明:
new,delete函数与malloc,free函数比较优点:new,delete函数进行类型检查,自动计算要分配类型的大小,而且属于C++语言的一部分。malloc,free函数是作为标准库函数提供给C的,它们并不是C语言的一部分。
7, 内存映射文件:
处理如在程序中读如DIB(设备无关位图文件)的问题时候:文件小一般是分配一个大小合适的缓冲区,打开文件,然后把整个文件读入缓冲区;如果文件大则可使内存映射文件来处理。
内存映射文件是:直接映射一个地址范围到相应的文件(注:个人理解 文件仍然存放在存放在磁盘上),当进程访问该范围内存页时候,OS分配RAM并从磁盘中读入该页数据。
说明:
1)默认情况下,当映射文件时候,虽然可能只映射文件的一部分,但整个文件仍然被占用。
2)MFC里不支持内存映射文件。CSshareFile类只支持HGLOBAL句柄进行剪切板内存传输,不大实用。
8,资源包含在EXE和DLL里,因此会占用虚拟地址空间,而且这些空间在进程的生存期内不会被改变。这就使我们很容易直接读取一个资源(如用LoadResource函数加载位图资源)
说明:
LoadResource : loads the specified resource into global memory. HGLOBAL LoadResource(
HMODULE hModule, // resource-module handle HRSRC hResInfo // resource handle );
LoadResource返回一个HGLOBAL值,但可以安全把它当成指针来使用(强制转换)。
? 9,堆使用的越多,程序的运行效率就越底下。WIN32程序的堆可以很大(要
多大就有多大,没有64KB限制,WIN16有16K的限制)。
九、
位图
1,Windows的位图实际上是一些和显示象素相对应的位阵列。
2,GDI位图是设备相关位图,用MS基本类库(MFC)中的CBitmap类表示的,依赖具体的设备。
3,DIB社设备无关位图,比GDI位图有许多编程优势。任何运行Windows的机器都可以处理DIB位图。DIB位图通常以.BMP文件形式保留在磁盘中,或作为资源保存在程序的EXE或DLL文件中。WIN32API只直接支持DIB格式文件。 4,Windows在位图中使用模糊颜色。GDI位图也是GDI对象,使用时先创建(并初始化),再把它选入设备环境,使用完后还要删除掉。
注意:
使用GDI位图的时候,不能直接把位图选进显示设备环境或打印机设备环境中。必须利用CDC::CreateCompatibleDC函数为位图创建一个特殊的内存设备环境,然后使用CDC::StretchBlt或CDC::BitBlt函数把内存设备环境中的各个位复制到真正的设备环境中。
说明:
1)CDC::CreateCompatibleDC
virtual BOOL CreateCompatibleDC( CDC* pDC );
// Creates a memory device context that is compatible with the device specified by pDC. A memory device context is a block of memory that represents a display surface. It can be used to prepare images in memory before copying them to the actual device surface of the compatible device.
2)CDC::BitBlt
BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
//Copies a bitmap from the source device context to this current device context. 3)CDC::StretchBlt
BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
//Moves a bitmap from a source rectangle and device into a destination rectangle, stretching or compressing the bitmap if necessary to fit the dimensions of the destination rectangle.
4)应用事例:
void CGDIView::OnDraw(CDC* pDC) {
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); CDC *pdcm=new CDC;
pdcm->CreateCompatibleDC(pDC); pdcm->SelectObject(&bitmap);
pDC->BitBlt(100,100,54,96,pdcm,0,0,SRCCOPY); delete pdcm;
//pDC->StretchBlt(100,100,500,50,pdcm,0,0,50,50,SRCCOPY); }
注:事例中显示映射模式为MM_TEXT,MM_TEXT下每个位图象素都映射到一个显示器象素。如果在其它的模式下需要进行一些伸缩变换处理。处理缩小的位图时候可以调用CDC::SetStretchBltMode函数(参数可选COLORONCOLOR)使缩小的位图显示更好些。
在非MM_TEXT模式下,使用BitBlt或StretchBlt函数,如果GDI要对其进行伸缩变换,则更新的速度较慢.可以使用以下代码代替BitBlt语句可加快其更新速度:
pDC->SetMapMode(MM_LOENGLISH);//设置映射模式为MM_LOENGLISH。 CSize size(54,96); pDC->DPtoLP(&size);
pDC->StretchBlt(0,0,si …… 此处隐藏:2998字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




