教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

VC++技术内幕(windows编程篇)(13)

来源:网络收集 时间:2026-07-12
导读: 的内存块,特定执行线程的局部内存,所有系统内存模块(包括虚拟内存表),Windows核心、执行过程及DLL(是OS的一部分)。 2,Windows 95进程地址空间: WIN95中,只有底下的2GB(0-0x7FFFFFFF)地址空间是进程私有

的内存块,特定执行线程的局部内存,所有系统内存模块(包括虚拟内存表),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字,全部文档内容请下载后查看。喜欢就下载吧 ……

VC++技术内幕(windows编程篇)(13).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/592946.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)